環境:mssql2005,在read committed級別
語句a:
begin tran
update table set f1='***' where f2='ttt' --更新一行或多行
--commit; //注意為了看到效果這裡把commit注釋了
語句a影響的行集合為b
該語句造成的影響
1.該語句會阻塞,查詢結果集合含有任意b集合中的行的select 語句
2.該語句會阻塞,對該錶其它行(b集合以外)進行update操作的語句
語句b:
update table set f4='***x' where f3='***' ,注意 這裡的f3列上無索引,否則不會阻塞。
問題分析:
當update 語句的where條件涉及列是非索引列時,mssql查詢引擎會執行全表掃瞄,在這個過程中會對每一行加上u鎖,如果該行是目標行,那麼u鎖會公升級成x鎖,然後進行更新操作,而非目標行的u鎖會在資料讀取完後馬上釋放
如下圖
如果你沒有執行commit語句,可以使用sp_lock檢視update查詢程序的鎖情況
這個時候當語句b執行時,b需要在每行上獲取一次u鎖,這個時候就會碰到上面未釋放的x鎖定行
當然如果語句b中的where 條件使用的是索引列,那麼語句b只會在索引涉及的列上加u鎖,如果a,b更新查詢的影響行無交集那麼a,b查詢互不影響。
圖)設定sql profiler的lock專案
關於SQL中的Update語句
今天在sql資料庫操作時需要將一張表中的資料update到另一張表中去,可是用我以往的寫法確怎麼也不能成功.如下 update table1 a set a.col1 b.col2 from table2 b where a.c b.c 上面的寫法似乎是在oracle的環境下可以實現的,具體沒有驗證...
關於SQL中的Update語句
今天在sql資料庫操作時需要將一張表中的資料update到另一張表中去,可是用我以往的寫法確怎麼也不能成功.如下 update table1 a set a.col1 b.col2 from table2 b where a.c b.c 上面的寫法似乎是在oracle的環境下可以實現的,具體沒有驗證...
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...