微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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页面锁定.这当然会对并发产生影响.

其他注意事项

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐