给你,我有几个问题。
我会很快和简单的。
我使用Server 2008,并且一直面临很多关于死锁的调用。
用户说他们在工作,然后他们得到了一个错误
事务(进程ID)与另一个进程在锁定资源上陷入僵局,并已被选择为死锁受害者。重新运行事务。
因此,我与开发人员联系,并告诉他们在查询中添加WITH (NO LOCK)。
它能工作100%的时间。
但是,这是对的吗?
有什么事情可以代替它吗,或者这是摆脱这些死锁的唯一方法吗?
谢谢
发布于 2014-12-16 12:57:59
好的。因此,死锁是两个进程争夺相同的数据,但在更新(或释放锁)之前等待另一个进程完成。锁定数据的原因之一是防止“脏读”。即读取过时的数据,因为它已经被更新了
因此,锁定是有原因的,也就是为了保护数据的完整性。只有当你确信你的系统不会因此而受损时,才应该用(没有锁)关闭它。否则,您将开始得到数据损坏,即糟糕的数据。
我想说,使用WITH (无锁)是安全的程序,只有报告,即选择,没有任何后续的更新,并没有影响系统的运作。对于选择然后更新不太好的过程。
根据@idstam的回答,如果您确实需要选择数据,对其做出一些决定,然后进行更新,这些需要尽可能短。也就是说,select和update之间的时间需要很短,因为这是锁存在的时间,因此也就是死锁的机会窗口。这在多用户系统中更为普遍,其中用户正在查看相同的数据。
因此,是的,您可以关闭锁定,但请注意,它可能会给您留下不良的数据。最好的办法是了解什么是死锁,并确定它是否可以改进。如果您试图通过降低隔离级别来最小化死锁,则需要使用行版本控制,即每次更新检查都在更新其上次看到的数据,如果没有更新(即在此期间更新),则会引发错误。
下面是一篇关于如何减少死锁的好的MSDN文章
发布于 2014-12-16 12:29:15
将数据库设置为使用行级版本控制。
保持交易的短暂性。
确保所有地方都以相同的顺序使用表。
在前面找个写锁是有帮助的。
发布于 2014-12-16 12:36:36
这取决于您对阅读一致性的关心程度,以及对性能的关心程度。
在这里阅读更多信息:http://technet.microsoft.com/en-us/library/ms188277(v=sql.105).aspx
https://stackoverflow.com/questions/27504674
复制相似问题