2010-04-08 46 views
0

我有一个表让我们说sql server 2000中的“xxx”。一个.exe通过sql作业将数据插入到表“xxx”中。但是插入数据后,一个存储过程正在读取该“xxx表”中的数据,并将其插入/更新到其他两个表中,并将状态更新回相同的“xxx”表。现在,客户说在该“xxx”表上发生了多个死锁。请任何人sdvice我解决步骤来解决这个僵局问题,以及如何逐步识别它.............单个表上的sql server死锁问题

在此先感谢..... XXX

回答

5

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

所以适用的Reducing SQL Server Deadlocks的一般规律:

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

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

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

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

0

从我对Sql Server 2000的经验来看,热衷于死锁的最好方法是限制查询内部的并行性。 这可以通过添加两个查询(插入和SP)或者甚至只是在查询的末尾插入提示选项(Maxdop 1)来完成

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

+0

执行查询的线程之间的死锁不会经常发生。这里的问题是发生转换死锁,这是因为两个事务在资源(页面,行,表)上持有共享锁并尝试将这些锁转换为X锁来更新数据。设置MAXDOP选项在这里没有帮助。 – 2010-04-11 21:23:07