单个表上的SQL Server死锁问题

时间:2010-04-08 19:18:50

标签: sql-server sql-server-2000 deadlock

我有一个表,在sql server 2000中说“xxx”。一个.exe通过sql job将数据插入到表“xxx”中。但是一旦插入数据,一个存储过程就是从“xxx表”读取数据并将其插入/更新到其他两个表中,并将状态更新回到同一个“xxx”表中。现在,客户端说在“xxx”表上发生了多个死锁。请友好地告诉我解决这个死锁问题的决议步骤,以及如何逐步识别它.............

提前致谢..... XXX

3 个答案:

答案 0 :(得分:5)

即使我可以访问您的系统和所有代码,这也是一个非常难以解决的问题。也就是说,你没有在你的问题中提供很多细节。

因此,应用Reducing SQL Server Deadlocks的一般规则:

  • 确保数据库设计已正确规范化。
  • 每次都让应用程序访问服务器对象的顺序相同。
  • 在交易期间,不允许任何用户输入。在交易开始之前收集它。
  • 避免使用游标。
  • 保持交易尽可能短。帮助实现此目的的一种方法是通过使用存储过程或使用单个批处理来减少应用程序与SQL Server之间的往返次数。减少事务完成所需时间的另一种方法是确保您不会一遍又一遍地执行相同的读取操作。如果您的应用程序确实需要多次读取相同的数据,请通过将其存储在变量或数组中来缓存它,然后从那里重新读取它,而不是从SQL Server中读取它。
  • 缩短锁定时间。尝试开发您的应用程序,以便在最近的时间抓取锁定,然后在最早的时间释放它们。
  • 如果适用,请使用ROWLOCK或PAGLOCK减少锁定升级。
  • 如果不经常修改被锁定的数据,请考虑使用NOLOCK提示来防止锁定。
  • 如果适用,请为运行事务的用户连接使用尽可能低的隔离级别。
  • 考虑使用绑定连接。

答案 1 :(得分:0)

您可能会尝试将提示应用于读取行的查询:with(updlock,holdlock)。尝试创建在选择阶段使用的聚簇索引(如果没有)。如果可能的话,尽量缩小事务中处理的行数。

是否可以先更新表中的行,然后填充其他表?如果出现错误,您可以回滚交易。

我建议不要使用NOLOCK提示,尤其是在更新相同数据时。

答案 2 :(得分:0)

根据我使用Sql Server 2000的经验来解决死锁的最佳方法是限制查询内的并行性。 这可以通过添加查询(插入和SP)甚至只是在查询末尾插入提示选项(Maxdop 1)来完成

这会限制性能,但您可以安全执行。 如果只有一个线程正在运行,则没有其他线程可以死锁。