sql-server – SQL Server,这个误导的XLOCK和优化

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server,这个误导的XLOCK和优化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从最近的一些测试和阅读我已经做了,似乎XLOCK的“X”(独家)名称的一部分是误导.实际上它不会锁定UPDLOCK.如果它是排他的,它会阻止外部SELECT,而不是它.

我看不到从阅读或测试和两者之间的区别.

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

此外,我遇到了一个blog,其中指出:

However,watch out for XLOCK hint. sql Server will effectively ignore XLOCK hint! There’s an optimization where sql Server check whether the data has changed since the oldest open transaction. If not,then an xlock is ignored. This makes xlock hints basically useless and should be avoided.

有没有人遇到这种现象?

根据我所看到的,似乎这个提示应该被忽略.

解决方法

X锁与U锁的独家性

lock compatibility matrix below中可以看出,X锁仅与架构稳定性和“插入范围 – 空”锁类型兼容. U与以下附加共享锁类型S / IS / RS-S / RI-S / RX-S兼容

lock compatibility matrix 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

但行仍然可以读!

事实证明,在读取提交的隔离级别,sql Server将不会总是取出S锁,it will skip this step if there is no risk of reading uncommitted data without them.这意味着不保证发生锁定冲突.

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

其他注意事项

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

猜你在找的MsSQL相关文章