Sql-Server

更新期間持有哪些鎖

  • April 3, 2022

當我有一個包含多個查詢的事務時,我可以通過使用waitfor和檢查dm_tran_locks.

但我不能將一個查詢“暫停”一半。具體來說,我想知道這個查詢將如何持有鎖:

update my_table set column1=new_value
where column2=filter_value

這會從一開始就需要更新鎖定嗎?或者它會在確定指定的行之前使用共享鎖where然後請求 U 鎖?

對於必須查看的每一行,它首先獲取一個更新鎖。它現在檢查該行是否符合修改條件。

  • 如果是,那麼它獲取一個排他鎖並釋放更新鎖。
  • 如果沒有,它只是釋放更新鎖。

也就是說,更新鎖的壽命很短,很難在野外捕捉到一個,除非它碰巧被阻塞(例如,被另一個更新鎖或排他鎖)。

關於它必須查看哪些行:假設您在lastname列上有一個索引,並且您的更新搜尋謂詞是:

WHERE lastname = 'Menoutis'
AND firstname = 'George'

SQL Server 可以使用lastname上的索引來“驅動”更新。即,它使用lastname列上的索引找到第一個Menoutis,並查看該Menoutis 的名字是否是George;並採取我上面描述的行動。然後對通過該索引找到的每個 Menoutis 執行相同的操作。

引用自:https://dba.stackexchange.com/questions/310373