SpringBoot使用Redisson時候進行Redis事務(wù)回滾方式
1. Redisson 的事務(wù)支持
Redisson 提供分布式事務(wù)功能,其核心機制是:
- 命令隊列:事務(wù)中的 Redis 命令會被緩存在客戶端隊列中,直到提交時批量執(zhí)行。
- 回滾機制:若事務(wù)未提交前發(fā)生異常,Redisson 會丟棄隊列中的命令,實現(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"); // 命令進入隊列,但未立即執(zhí)行
// 如果此處拋出異常,事務(wù)回滾,Redis 操作不會生效
someDatabaseOperation(); // 假設(shè)同時操作數(shù)據(jù)庫
}3. 事務(wù)回滾的條件
- 當(dāng)方法拋出 unchecked exception(如
RuntimeException)時,Spring 會自動回滾事務(wù)。 - 若需要回滾 checked exception,需通過
@Transactional(rollbackFor = MyException.class)指定。
4. 重要注意事項
- 跨資源事務(wù):Redis 事務(wù)與數(shù)據(jù)庫事務(wù)是獨立的,若需保證跨 Redis 和數(shù)據(jù)庫的強一致性,需引入 分布式事務(wù)方案(如 Seata 或 JTA)。
- 性能影響:Redis 事務(wù)通過命令隊列實現(xiàn),長時間未提交的事務(wù)可能導(dǎo)致連接阻塞,需合理設(shè)計事務(wù)邊界。
- Watch 命令限制:Redisson 事務(wù)不支持 Redis 原生的
WATCH命令,需改用RLock或RReadWriteLock實現(xiàn)樂觀鎖。
5. 手動事務(wù)管理(不推薦)
如果需要細粒度控制,可直接使用 Redisson 的 RTransaction 對象:
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ù)誤用,必要時升級為分布式事務(wù)方案。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot下token短信驗證登入登出權(quán)限操作(token存放redis,ali短信接口)
這篇文章主要介紹了SpringBoot下token短信驗證登入登出權(quán)限操作(token存放redis,ali短信接口),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
解決Java執(zhí)行Cmd命令出現(xiàn)的死鎖問題
這篇文章主要介紹了關(guān)于Java執(zhí)行Cmd命令出現(xiàn)的死鎖問題解決,解決方法就是在waitfor()方法之前讀出窗口的標(biāo)準(zhǔn)輸出、輸出、錯誤緩沖區(qū)中的內(nèi)容,本文給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07
java8 List<Object>去掉重復(fù)對象的幾種方法
本文主要介紹了java8 List<Object>去掉重復(fù)對象的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Java如何獲取當(dāng)前進程ID以及所有Java進程的進程ID
本篇文章主要介紹了Java如何獲取當(dāng)前進程ID以及所有Java進程的進程ID,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

