当我有一个包含多个查询的事务时,我可以通过使用waitfor
和检查dm_tran_locks
.
但我不能将一个查询“暂停”一半。具体来说,我想知道这个查询将如何持有锁:
update my_table set column1=new_value
where column2=filter_value
这会从一开始就需要更新锁定吗?或者它会在确定指定的行之前使用共享锁where
,然后请求 U 锁?
当我有一个包含多个查询的事务时,我可以通过使用waitfor
和检查dm_tran_locks
.
但我不能将一个查询“暂停”一半。具体来说,我想知道这个查询将如何持有锁:
update my_table set column1=new_value
where column2=filter_value
这会从一开始就需要更新锁定吗?或者它会在确定指定的行之前使用共享锁where
,然后请求 U 锁?
对于必须查看的每一行,它首先获取一个更新锁。它现在检查该行是否符合修改条件。
也就是说,更新锁的寿命很短,很难在野外捕捉到一个,除非它碰巧被阻塞(例如,被另一个更新锁或排他锁)。
关于它必须查看哪些行:假设您在lastname列上有一个索引,并且您的更新搜索谓词是:
SQL Server 可以使用lastname上的索引来“驱动”更新。即,它使用lastname列上的索引找到第一个Menoutis,并查看该Menoutis 的名字是否是George;并采取我上面描述的行动。然后对通过该索引找到的每个 Menoutis 执行相同的操作。