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)
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)
归档时间: |
|
查看次数: |
475 次 |
最近记录: |