mysql併發更新
常見方案
樂觀鎖
select * from tab1 where id = ?;
update tab1 set col1 = ? where id = ? and version = ?;
- 缺點
- 在高併發下可能更新失敗,因此須要經過重試(select...,update...)來提升更新成功率
select * from tab1 where id = ? for update;
update tab1 set col1 = ? where id = ?;
- 注意
- select…for update會把數據給鎖住,不過咱們須要注意一些鎖的級別,MySQL InnoDB默認行級鎖。行級鎖都是基於索引的,若是一條SQL語句用不到索引是不會使用行級鎖的,會使用表級鎖把整張表鎖住,這點須要注意。
- 優勢
- 缺點
- 可能致使其它相關的(包含該for update行內容)併發操做阻塞
update tab1 set col1 = col1-1 where col1>1
- 優勢
- 缺點
- 沒法獲取更新先後col1字段的值
- 只適用於簡單的where條件
異步更新
- 優勢
- 減小客戶端等待時間
- 提升服務端的併發量
- 把併發操做轉化爲更簡單的同步操做
- 缺點
- 服務端和客戶端須要支持異步消息通知,由於異步操做的結果只能異步返回
- 須要使用消息隊列和異步消息通知,若是沒有現成框架支持,代碼實現會更加複雜
- 不支持其餘須要依賴更新結果的邏輯,除非全部邏輯都異步化
參考