1. 程式人生 > 實用技巧 >CAS下ABA問題及優化方案

CAS下ABA問題及優化方案

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

  • 分段加鎖
  • 儘可能讓所有資料檢索都通過索引來完成,避免行鎖(走索引)升級為表鎖 ;
  • 儘可能較少檢索條件,避免間隙鎖 ;
  • 儘量控制事務大小,減少鎖定資源量和時間長度
  • 鎖住某行後,儘量不要去調別的行或表,儘快處理被鎖住的行然後釋放掉鎖
  • 涉及相同表的事務,對於呼叫表的順序儘量保持一致
  • 在業務環境允許的情況下, 儘可能低級別事務隔離