BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

SQL Server 2014 SP1的NOLOCK指令中断

| 作者 Jonathan Allen 关注 529 他的粉丝 ,译者 刘嘉洋 关注 0 他的粉丝 发布于 2016年6月2日. 估计阅读时间: 2 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

在针对SQL Server 2014 SP1的Cumulative Update #6更新中,NOLOCK指令中断。因此,依赖NOLOCK指令的数据库可能会意外地经历阻塞或是死锁。根据SQL Server Release Services博客最新更新的一篇文章,具体的情景是这样的:

在默认的基于锁的隔离级别或更高的隔离级别下,执行并行的SELECT (…) INTO Table FROM
SourceTable语句,特别当使用NOLOCK提示时。在这种情况下其他试图访问SourceTable的查询将阻塞。

当一个事务持有对象的排他锁(例如进行中的表更新),另外一个事务正在执行并行的SELECT (…) FROM
SourceTable,并使用NOLOCK提示。在这种情况下,尝试访问SourceTable的SELECT查询将被阻塞。

根据Microsoft发布团队的成员Pedro Lopes所说,这个错误不会影响使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED的代码。

早在推出行级版本(row level versioning),又称快照隔离之前,NOLOCK 提示就经常需要避免阻塞和死锁。然而,使用它会有一些风险。通过设计,运行NOLOCK的查询可以读取在事务中改变的数据。这代表着决策可以基于最终回滚的事务。同样,决策也可以基于局部更新,例如使用一个记录的新版本和另一个相关记录的旧版本。

由于这些原因,一般不赞成在新的数据库中使用NOLOCK(和READ UNCOMMITTED)。然而,我们不能简单地将现有的数据库转移到行级版本。虽然它可以在不发生脏读的情况下解决阻塞问题,但是它还是需要增加tempdb使用的成本。

Brent Ozar Unlimited提供了一款通知服务,当问题解决的时候通知所有DBA。你可以在sqlserverupdates.com报名。

查看英文原文NOLOCK is Broken in SQL Server 2014 SP1


感谢张龙对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT