SQL Server,误导性的XLOCK和优化

Iam*_*mIC 17 sql-server locking sql-server-2008 pessimistic-locking

从我最近的一些测试和阅读中看来,似乎XLOCK的"X"(独家)名称部分具有误导性.它实际上不会锁定UPDLOCK.如果它是独占的,它将阻止外部SELECT,但它不会.

我无法从阅读或测试中看到两者之间的区别.

XLOCK创建独占锁的唯一时间是与TABLOCK一起使用时.我的第一个问题是"为什么只有这种粒度?"

此外,我遇到了一个博客,其中说明了以下内容:

但请注意XLOCK提示.SQL Server将有效地忽略XLOCK提示!SQL Server检查自最早的打开事务以来数据是否已更改,这是一种优化.如果不是,则忽略xlock.这使得xlock提示基本上没用,应该避免.

有人遇到过这种现象吗?

根据我所看到的情况,似乎应该忽略这一提示.

Mar*_*ith 20

X锁与U锁的排他性

下面锁兼容性矩阵中,可以看到X锁只与架构稳定性和插入范围 - 空锁定类型兼容.U兼容以下额外的共享锁类型S/ IS/ RS-S/ RI-S/RX-S

锁兼容性矩阵http://i.msdn.microsoft.com/ms186396.LockConflictTable(en-us,SQL.105).gif

X锁的粒度

这些都在各个层面都很好.下面的脚本和探查器跟踪演示了它们是否在行级别成功取出.

CREATE TABLE test_table (id int identity(1,1) primary key, col char(40))

INSERT INTO test_table
SELECT NEWID() FROM sys.objects

select * from test_table with (rowlock,XLOCK) where id=10
Run Code Online (Sandbox Code Playgroud)

跟踪

但仍然可以读取行!

事实证明,在read committed隔离级别,SQL Server不会总是取出S锁定,如果没有它们没有读取未提交数据的风险,它将跳过此步骤.这意味着无法保证发生锁定冲突.

但是,如果初始选择是,with (paglock,XLOCK)则这停止读取事务,因为X页面上的锁定将阻止IS读取器始终需要的页面锁定.这当然会对并发性产生影响.

其他警告

即使您锁定行/页面,这也不意味着您阻止对表中该行的所有访问.对聚簇索引中的行执行锁定不会阻止查询从覆盖的非聚簇索引中的相应行读取数据.

  • @IanC,很可能是`XLOCK`提示可以追溯到Sybase:http://en.wikipedia.org/wiki/Microsoft_SQL_Server#Genesis (2认同)
  • 我已经放弃尝试去理解 SO 投票的变幻莫测! (2认同)