CAS下ABA問題及優化方案
阿新 • • 發佈:2020-10-09
CAS下ABA問題及優化方案
一、什麼是CAS
二、什麼是ABA問題
三、解決方法
1. 表結構加欄位解決
- 版本號: Version(更新資料時通過對比原始版本號,如果一致則更新,同時版本號version+1)
- 更新時間:update_time: update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP
2. 優化鎖粒度
防止因樂觀鎖,導致併發失敗次數較多,引起使用者體驗不好,需要控制好鎖的粒度。
- 條件控制:
update wallet set balance = balance-$value where uid = $uid and update_time=$update_time and balance = balance-$value>0
- 分段加鎖
- 儘可能讓所有資料檢索都通過索引來完成,避免行鎖(走索引)升級為表鎖 ;
- 儘可能較少檢索條件,避免間隙鎖 ;
- 儘量控制事務大小,減少鎖定資源量和時間長度;
- 鎖住某行後,儘量不要去調別的行或表,儘快處理被鎖住的行然後釋放掉鎖;
- 涉及相同表的事務,對於呼叫表的順序儘量保持一致;
- 在業務環境允許的情況下, 儘可能低級別事務隔離;