關於Update語句的鎖

2021-09-08 14:56:12 字數 1076 閱讀 4651

環境: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...