聊聊sql的併發update

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

指定主鍵update

update tableA set owner = ? where id = ?

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

指定主鍵和版本號

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

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

指定主鍵及與更新字段相關的條件

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

先到的sql先執行,並且owner發生變化,安排到後執行的sql,因爲owner發生變化,則未能執行成功atom

更新值與原值相關

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

這個語句併發執行,最終在db那裏仍是會轉化爲串行,而後加鎖進行,最後的效果相似atomic integer的incr。.net

至關於以下:code

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提交成功,他纔會得到這個鎖,從而對數據進行修改。blog

doc

相關文章
相關標籤/搜索