本文主要簡述一下不一樣sql語句併發update的狀況。sql
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