聊聊sql的併發update

codecraft發表於2017-11-10

本文主要簡述一下不同sql語句併發update的情況。

指定主鍵update

update tableA set owner = ? where id = ?

這種情況下,併發執行,最後執行的覆蓋掉前面執行的

指定主鍵和版本號

update tableA set owner = ? where id =? and version = ?

這種帶有版本號或時間戳的,屬於樂觀鎖方案,併發執行的sql,最先到的執行完之後,版本號發生變化,同一時刻併發的同版本號的update語句由於版本號對不上則無法udpate成功

指定主鍵及與更新欄位相關的條件

update tableA set owner = ? where id = ? and owner =?

先到的sql先執行,而且owner發生變化,安排到後執行的sql,由於owner發生變化,則未能執行成功

更新值與原值相關

update tableA set totalNum = totalNum + ? where id = ?

這個語句併發執行,最終在db那裡還是會轉化為序列,然後加鎖進行,最後的效果類似atomic integer的incr。

相當於如下:

1) open a transaction
2) fetch the data (SELECT totalNum FROM tableA WHERE id = ?;)
3) do your work (totalNum + amount)
4) update the data (UPDATE tableA SET totalNum = ? WHERE id = 1;)
5) commit

第一個update會持有id=?這行記錄的排它鎖,第二個update需要持有這個記錄的排它鎖的才能對他進行修改,第二個update阻塞直到第一個update提交成功,他才會獲得這個鎖,從而對資料進行修改。

doc

相關文章