Geo*_*tis 3 sql-server locking
当我有一个包含多个查询的事务时,我可以通过使用waitfor和检查dm_tran_locks.
但我不能将一个查询“暂停”一半。具体来说,我想知道这个查询将如何持有锁:
update my_table set column1=new_value
where column2=filter_value
Run Code Online (Sandbox Code Playgroud)
这会从一开始就采取更新锁定吗?还是会先获取共享锁,直到确定指定的行where,然后请求 U 锁?
对于必须查看的每一行,它首先获取更新锁。现在它检查该行是否符合修改条件。
即,更新锁的生命周期非常短,并且很难在野外捕获更新锁,除非它碰巧被阻止(例如,被另一个更新锁或独占锁)。
关于它必须查看哪些行:假设您在姓氏列上有一个索引,并且更新的搜索谓词是:
WHERE lastname = 'Menoutis'
AND firstname = 'George'
Run Code Online (Sandbox Code Playgroud)
SQL Server 可以使用姓氏上的索引来“驱动”更新。即,它使用姓氏列上的索引找到第一个 Menoutis ,并查看该 Menoutis 的名字是否是 George;并按照我上面描述的方式采取行动。然后对通过该索引找到的每个 Menoutis 执行相同的操作。