Sil*_*ent 9 deadlock sql-server-2008
偶尔我会在生产环境中得到以下错误,这会在再次运行相同的存储过程时消失.
事务(进程ID 86)在锁资源上与另一个进程死锁,并被选为死锁牺牲品.重新运行该交易
有人告诉我,如果我在我的存储过程中使用NOLOCK提示,它将确保它永远不会死锁.它是否正确?有没有更好的方法来处理这个错误?
预计会像SQL Server/Sybase一样锁定RDBMS上的偶然死锁.
您可以在客户端上编码,以按照我的MSDN"处理死锁"的建议重试.基本上,检查SQLException,也许半秒后,再试一次.
否则,您应该检查您的代码,以便对表的所有访问都按相同的顺序进行.或者您可以使用SET DEADLOCK_PRIORITY来控制谁成为受害者.
在MSDN for SQL Server上,"最小化死锁"启动
虽然死锁不能完全避免
这也提到了"使用较低的隔离级别",我不喜欢(与SO上的许多SQL类型相同)并且是您的问题.不要这样做是答案...... :-)
注意:MVCC类型RDBMS(Oracle,Postgres)没有这个问题.请参阅http://en.wikipedia.org/wiki/ACID#Locking_vs_multiversioning, 但MVCC还有其他问题.