U锁的持续时间是多少

Bor*_*rka 1 sql-server locking update

据我所知,无论使用哪种隔离级别,SQL Server 在事务期间都会持有 X 锁。U锁呢?如果一个事务在 UPDATE 语句中读取了 100 条记录(U 锁)但只更新了 10 条记录,那么在更新完成后,如果 tran 仍然打开,我们会得到 90-U 和 10-X 吗?

回应以下大卫的回答:不,这些情况不相关(感谢您的回答!)。我无法发布代码,因为我手头没有电脑,但我将尝试简要描述这种情况。我有一堆。我更新了,更新了10条记录。问:我们会在 ... 点有任何 U 锁,还是在获得 X 锁后释放它们?谢谢!

Begin tran;

Update t
Set b = 10
Where a = 1;
...
Run Code Online (Sandbox Code Playgroud)

Dav*_*oft 5

UPDATE 将使用 U 锁读取,如果它不打算使用 X 锁并更改行,则立即释放每个 U 锁。Profiler 将通过 Lock:Acquired 和 Lock:Released 事件向您展示这一点。

EG 堆上的更新将 IX 锁定对象,然后对每个页面 IU 锁定该页面,然后对每一行 U 锁定该行,然后释放 U 锁或转换为页面上的 IX 锁,然后转换为 X 锁行并更新它。当它读取页面上的最后一行时,页面锁定将被释放。

use tempdb

select * 
into test 
from sys.objects

go

begin tran
update test set name = 'foo2'
where object_id = 9
Run Code Online (Sandbox Code Playgroud)

有一个这样的锁定序列:

Lock:Acquired                               59      8 - IX  5 - OBJECT  
Lock:Acquired   5:64                            59      7 - IU  6 - PAGE    
Lock:Acquired   5:64:0                          59      4 - U   9 - RID 
Lock:Released   5:64:0                          59      4 - U   9 - RID 
Lock:Acquired   5:64:1                          59      4 - U   9 - RID 
Lock:Released   5:64:1                          59      4 - U   9 - RID 
Lock:Acquired   5:64:2                          59      4 - U   9 - RID 
Lock:Released   5:64:2                          59      4 - U   9 - RID 
Lock:Acquired   5:64:3                          59      4 - U   9 - RID 
Lock:Released   5:64:3                          59      4 - U   9 - RID 
Lock:Acquired   5:64:4                          59      4 - U   9 - RID 
Lock:Released   5:64:4                          59      4 - U   9 - RID 
Lock:Acquired   5:64:5                          59      4 - U   9 - RID 
Lock:Acquired   5:64                            59      8 - IX  6 - PAGE    
Lock:Acquired   5:64:5                          59      5 - X   9 - RID 
Lock:Released   5:64:5                          59      0 - NULL    9 - RID 
Lock:Acquired   5:64:6                          59      4 - U   9 - RID 
. . . continue reading rows
Run Code Online (Sandbox Code Playgroud)