本文主要簡述一下不同sql語句併發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提交成功,他才會獲得這個鎖,從而對資料進行修改。
update 過程 併發查詢記錄
update t1 set t1.object name 222 時會掃瞄t1表,在記錄上加tx事務鎖 記錄級排他鎖 然後更新,然後再接著掃瞄,再加鎖後續記錄,再更新後續記錄,提交事務時,鎖釋放。併發更新時,如果t1事務先掃瞄到資料加鎖了某條記錄 不是先發起更新 t2事務再掃瞄到這條資料,就會等待t...
SQL語句 UPDATE語句
update students set sname abcd gender 1 where sid 1 update students,students2 set students.sname students2.sname,students.gender students2.gender wher...
關於SQL中的Update語句
今天在sql資料庫操作時需要將一張表中的資料update到另一張表中去,可是用我以往的寫法確怎麼也不能成功.如下 update table1 a set a.col1 b.col2 from table2 b where a.c b.c 上面的寫法似乎是在oracle的環境下可以實現的,具體沒有驗證...