首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于DeadLock的问题

关于DeadLock的问题
EN

Stack Overflow用户
提问于 2014-12-16 12:27:03
回答 4查看 81关注 0票数 0

给你,我有几个问题。

我会很快和简单的。

我使用Server 2008,并且一直面临很多关于死锁的调用。

用户说他们在工作,然后他们得到了一个错误

事务(进程ID)与另一个进程在锁定资源上陷入僵局,并已被选择为死锁受害者。重新运行事务。

因此,我与开发人员联系,并告诉他们在查询中添加WITH (NO LOCK)

它能工作100%的时间。

但是,这是对的吗?

有什么事情可以代替它吗,或者这是摆脱这些死锁的唯一方法吗?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-16 12:57:59

好的。因此,死锁是两个进程争夺相同的数据,但在更新(或释放锁)之前等待另一个进程完成。锁定数据的原因之一是防止“脏读”。即读取过时的数据,因为它已经被更新了

因此,锁定是有原因的,也就是为了保护数据的完整性。只有当你确信你的系统不会因此而受损时,才应该用(没有锁)关闭它。否则,您将开始得到数据损坏,即糟糕的数据。

我想说,使用WITH (无锁)是安全的程序,只有报告,即选择,没有任何后续的更新,并没有影响系统的运作。对于选择然后更新不太好的过程。

根据@idstam的回答,如果您确实需要选择数据,对其做出一些决定,然后进行更新,这些需要尽可能短。也就是说,select和update之间的时间需要很短,因为这是锁存在的时间,因此也就是死锁的机会窗口。这在多用户系统中更为普遍,其中用户正在查看相同的数据。

因此,是的,您可以关闭锁定,但请注意,它可能会给您留下不良的数据。最好的办法是了解什么是死锁,并确定它是否可以改进。如果您试图通过降低隔离级别来最小化死锁,则需要使用行版本控制,即每次更新检查都在更新其上次看到的数据,如果没有更新(即在此期间更新),则会引发错误。

下面是一篇关于如何减少死锁的好的MSDN文章

票数 1
EN

Stack Overflow用户

发布于 2014-12-16 12:29:15

将数据库设置为使用行级版本控制。

保持交易的短暂性。

确保所有地方都以相同的顺序使用表。

在前面找个写锁是有帮助的。

票数 0
EN

Stack Overflow用户

发布于 2014-12-16 12:36:36

这取决于您对阅读一致性的关心程度,以及对性能的关心程度。

  • 使用(无锁)-没有读取锁,但您受陈旧的,不一致的数据影响。
  • 行级版本-行的旧版本保留“在旁边”。这也消除了对您正在执行的每个DML附加开销的读取锁定。

在这里阅读更多信息:http://technet.microsoft.com/en-us/library/ms188277(v=sql.105).aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27504674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档