我需要在sql server表上执行un update语句,此表由另一个进程同时使用。因为有时会发生僵局。您是否建议隔离级别以避免或最小化此死锁?
答案 0 :(得分:8)
READ UNCOMMITTED
但是,这允许进程在事务提交之前读取数据,即所谓的脏读。 Further Reading
您可能更喜欢打开行版本控制,更新会创建该行的新版本,而任何其他select语句都会使用旧版本,直到此版本提交为止。要执行此操作,请启用READ_COMMITTED_SNAPSHOT模式。还有更多信息here。有一个开销涉及维护行的版本,但它会删除UPDATE / SELECT死锁。
答案 1 :(得分:2)
这里使用READ UNCOMMITTED的建议是可以的,但是他们真的侧面解决了为什么你首先陷入僵局的问题。如果您不关心脏读,那么这很好,但如果您需要隔离(一致性等)的好处,那么我建议您在应用程序中找出正确的锁定策略。
我没有那个答案 - 我自己一直在制定一些策略。有关讨论,请参阅this question的评论。
答案 2 :(得分:1)
查看快照隔离 - 使用此级别的隔离是一致性和速度之间的良好折衷。我可能会因此而被火上浇油,但我相信在这种隔离级别遇到的死锁要困难得多。
这是否是解决僵局问题的正确方法,这完全是另一回事。
答案 3 :(得分:0)
使用游标或循环更新批处理中的少量行,这可以避免SQL Server进入表锁定。