Redisson分布式鎖使用採坑記

2021-10-13 12:58:44 字數 1077 閱讀 7917

先說問題:

redissonmultilock分布式鎖在使用的時候,可以指定兩個值:等待時間和超時時間

系統**現的問題:在上游系統呼叫建立訂單的介面時候,網路的原因,導致介面響應超時,上游就進行了自動重試,結果:我這邊的系統根據上游的單號生成了兩筆同時生效的訂單

在前面筆記中redis分布式鎖和aop使用注意問題有說過,介面是做了冪等的校驗。並且分布式鎖的優先順序也低於事務,那這個問題就奇怪了

後來根據線上日誌,分析了下,事務和分布式鎖優先順序也是正常的,和系統介面處理時間超過了redisson的加鎖時間導致的;

在redisson鎖在加鎖的時候,我預設指定了超時時間,但是介面在呼叫的時候,由於網路的原因,導致我這邊的系統去呼叫下游系統的時候超時了,所以redisson鎖就自動釋放了,順帶著解決這個問題,也看了下redisson的部分原始碼,下篇筆記中記錄原始碼

我自己系統中設定的redisson加鎖時間是5s,超過5s之後,redisson就自動釋放鎖了,所以在響應超時的時候,就會出現問題:

a系統呼叫我的b系統,我們認為是thread1來建立訂單,我的b系統在建立訂單的時候,也要去呼叫其他系統獲取一些資料進行校驗,由於網路的原因,導致我這裡響應的時間超過了5s;

所以此時問題就來了:我加的分布式鎖在5s之後,就鎖釋放了,但是此時thread1的**還在執行,事務並沒有提交

此時a系統又發起了重試,此時我們認為是thread2來加鎖,此時的狀況是:上一次加的鎖已經釋放了,但是事務還沒有提交

a系統的thread2嘗試加鎖,加鎖成功了,接著進行了冪等校驗,由於此時上一次thread1的事務沒有提交,所以資料庫中還沒有記錄,所以冪等校驗通過,此時第二次加鎖的執行緒就開始建立訂單,在建立的過程中,第一次加鎖的執行緒提交了事務。。。

所以尷尬的是,資料庫中對應的表字段也沒有加唯一性索引,所以就插入了多條同時生效的記錄

解決辦法:

1.在資料庫中加字段,根據業務單號 + 訂單狀態 做唯一性索引

2.在redisson加鎖的時候,不指定超時時間,讓redisson自動續鎖

3.將redisson加鎖時間設定的更長一點

第三種方法是比較快的一種臨時解決方案,但是長遠來看,可能還是第一種和第二種會比較好一點

redisson分布式鎖

介面做冪等的方式很多,我們應用使用分布式鎖 插入明細來做冪等。但是發現冪等失效了,最終確認是業務執行尚未結束,還沒有插入明細。但是客戶端第二個訪問就來到了,此時呢,分布式鎖的時間也失效了。也就是兩個問題 1是業務執行為什麼很慢,這個就有很多種情況暫不考慮。考慮第二種情況,能不能加長分布式鎖的時間。由...

分布式鎖 redisson

1 匯入依賴 org.redissongroupid redissonartifactid 3.11.1version dependency 2 配置redisson configuration public class redissonconfig spring name cjs redisson...

redis分布式鎖redisson

原文 關於redisson的源 請參考官網 redisson官方講解參考 wiki e7 9b ae e5 bd 95 首先需要引入redisson org.springframework.bootgroupid spring boot starter data redisartifactid de...