mysql併發更新

mysql併發更新

常見方案

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