SpringBoot使用Redisson時(shí)候進(jìn)行Redis事務(wù)回滾方式
1. Redisson 的事務(wù)支持
Redisson 提供分布式事務(wù)功能,其核心機(jī)制是:
- 命令隊(duì)列:事務(wù)中的 Redis 命令會(huì)被緩存在客戶端隊(duì)列中,直到提交時(shí)批量執(zhí)行。
- 回滾機(jī)制:若事務(wù)未提交前發(fā)生異常,Redisson 會(huì)丟棄隊(duì)列中的命令,實(shí)現(xiàn)回滾。
2. 與 Spring 事務(wù)的整合
通過 RedissonTransactionManager,Redisson 能夠與 Spring 的聲明式事務(wù)(@Transactional)無縫集成:
- 配置示例:
@Configuration
public class RedissonConfig {
@Bean
public RedissonTransactionManager transactionManager(RedissonClient redissonClient) {
return new RedissonTransactionManager(redissonClient);
}
}- 事務(wù)使用:
@Transactional
public void transactionalMethod() {
RMap<String, String> map = redissonClient.getMap("myMap");
map.put("key1", "value1"); // 命令進(jìn)入隊(duì)列,但未立即執(zhí)行
// 如果此處拋出異常,事務(wù)回滾,Redis 操作不會(huì)生效
someDatabaseOperation(); // 假設(shè)同時(shí)操作數(shù)據(jù)庫
}3. 事務(wù)回滾的條件
- 當(dāng)方法拋出 unchecked exception(如
RuntimeException)時(shí),Spring 會(huì)自動(dòng)回滾事務(wù)。 - 若需要回滾 checked exception,需通過
@Transactional(rollbackFor = MyException.class)指定。
4. 重要注意事項(xiàng)
- 跨資源事務(wù):Redis 事務(wù)與數(shù)據(jù)庫事務(wù)是獨(dú)立的,若需保證跨 Redis 和數(shù)據(jù)庫的強(qiáng)一致性,需引入 分布式事務(wù)方案(如 Seata 或 JTA)。
- 性能影響:Redis 事務(wù)通過命令隊(duì)列實(shí)現(xiàn),長時(shí)間未提交的事務(wù)可能導(dǎo)致連接阻塞,需合理設(shè)計(jì)事務(wù)邊界。
- Watch 命令限制:Redisson 事務(wù)不支持 Redis 原生的
WATCH命令,需改用RLock或RReadWriteLock實(shí)現(xiàn)樂觀鎖。
5. 手動(dòng)事務(wù)管理(不推薦)
如果需要細(xì)粒度控制,可直接使用 Redisson 的 RTransaction 對(duì)象:
RTransaction transaction = redissonClient.createTransaction(TransactionOptions.defaults());
try {
transaction.getMap("myMap").put("key1", "value1");
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}總結(jié)
Redisson 在 Spring Boot 中支持事務(wù)回滾,但需確保:
- 正確配置
RedissonTransactionManager。 - 使用
@Transactional注解標(biāo)記事務(wù)方法。 - 避免跨資源(如 Redis + 數(shù)據(jù)庫)的本地事務(wù)誤用,必要時(shí)升級(jí)為分布式事務(wù)方案。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能
這篇文章主要為大家詳細(xì)介紹了Java簡易聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10
SpringBootTest單元測試報(bào)錯(cuò)的解決方案
這篇文章主要介紹了SpringBootTest單元測試報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot下token短信驗(yàn)證登入登出權(quán)限操作(token存放redis,ali短信接口)
這篇文章主要介紹了SpringBoot下token短信驗(yàn)證登入登出權(quán)限操作(token存放redis,ali短信接口),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
java中的阻塞隊(duì)列應(yīng)用場景及代碼實(shí)例
這篇文章主要介紹了java中的阻塞隊(duì)列應(yīng)用場景及代碼實(shí)例阻塞隊(duì)列是一種特殊的隊(duì)列,它提供了線程安全的操作,并在隊(duì)列為空或滿時(shí)提供了阻塞的功能,阻塞隊(duì)列通常用于多線程場景,其中生產(chǎn)者線程向隊(duì)列中添加元素,而消費(fèi)者線程從隊(duì)列中獲取元素,需要的朋友可以參考下2024-01-01
解決Java執(zhí)行Cmd命令出現(xiàn)的死鎖問題
這篇文章主要介紹了關(guān)于Java執(zhí)行Cmd命令出現(xiàn)的死鎖問題解決,解決方法就是在waitfor()方法之前讀出窗口的標(biāo)準(zhǔn)輸出、輸出、錯(cuò)誤緩沖區(qū)中的內(nèi)容,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
java8 List<Object>去掉重復(fù)對(duì)象的幾種方法
本文主要介紹了java8 List<Object>去掉重復(fù)對(duì)象的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Java如何獲取當(dāng)前進(jìn)程ID以及所有Java進(jìn)程的進(jìn)程ID
本篇文章主要介紹了Java如何獲取當(dāng)前進(jìn)程ID以及所有Java進(jìn)程的進(jìn)程ID,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

