1. 程式人生 > >分散式中的冪等性

分散式中的冪等性

1.什麼是冪等性,就是你操作無數波操作和你操作一波效果一毛一樣的。比如你下單,不會說瘋狂點,下n張一樣的單。

2.那如何做到冪等性處理呢?

關鍵所在是他們有唯一的區別性id之類的,比如唯一的訂單號,可以防止你多次支付

如何防止你一激動,瘋狂點提交呢?

解決方案:

1)當你提交之後,按鈕給你變成不可按的,看你還怎麼皮,哈哈

2)每當你訪問一個頁面時,生成一個token(唯一的),儲存在redis,為了和你傳過來的token對比真實性。如果你多次提交,在redis上如果存在這個token說明你已經提交一次了,再次提交就失效了。

還有一些實際的處理方案

1)利用樂觀鎖

通過版本號去控制

2)悲觀鎖也行

select * from xx for update

悲觀鎖和樂觀鎖的區別

悲觀鎖和樂觀鎖是資料庫用來保證資料併發安全防止更新丟失的兩種方法,樓主列舉的例子在select ... for update前加個事務就可以防止更新丟失。悲觀鎖和樂觀鎖大部分場景下差異不大,一些獨特場景下有一些差別,一般我們可以從如下幾個方面來判斷:
1.響應速度:如果需要非常高的響應速度,建議採用樂觀鎖方案,成功就執行,不成功就失敗,不需要等待其他併發去釋放鎖
2.衝突頻率:如果衝突頻率非常高,建議採用悲觀鎖,保證成功率,如果衝突頻率大,樂觀鎖會需要多次重試才能成功,代價比較大
3.重試代價:如果重試代價大,建議採用悲觀鎖

3)redis分散式鎖

支付完刪除值,所以可以防止多次提交

4)token令牌的問題

支付前拿到一個token,然後支付的時候帶上這個token,驗證真實性然後如果redis上有這個token說明還沒支付,否則就已經支付完成

轉載:https://blog.csdn.net/weixin_38336658/article/details/80445743