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條件
異步更新
  • 優點
    • 減少客戶端等待時間
    • 提高服務端的並發量
    • 把並發操作轉化為更簡單的同步操作
  • 缺點
    • 服務端和客戶端需要支持異步消息通知,因為異步操作的結果只能異步返回
    • 需要使用消息隊列和異步消息通知,如果沒有現成框架支持,代碼實現會更加復雜
    • 不支持其他需要依賴更新結果的邏輯,除非所有邏輯都異步化
參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM