Sql-Server
更新期間持有哪些鎖
當我有一個包含多個查詢的事務時,我可以通過使用
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 執行相同的操作。