我有一个表让我们说sql server 2000中的“xxx”。一个.exe通过sql作业将数据插入到表“xxx”中。但是插入数据后,一个存储过程正在读取该“xxx表”中的数据,并将其插入/更新到其他两个表中,并将状态更新回相同的“xxx”表。现在,客户说在该“xxx”表上发生了多个死锁。请任何人sdvice我解决步骤来解决这个僵局问题,以及如何逐步识别它.............单个表上的sql server死锁问题
在此先感谢..... XXX
我有一个表让我们说sql server 2000中的“xxx”。一个.exe通过sql作业将数据插入到表“xxx”中。但是插入数据后,一个存储过程正在读取该“xxx表”中的数据,并将其插入/更新到其他两个表中,并将状态更新回相同的“xxx”表。现在,客户说在该“xxx”表上发生了多个死锁。请任何人sdvice我解决步骤来解决这个僵局问题,以及如何逐步识别它.............单个表上的sql server死锁问题
在此先感谢..... XXX
即使我有权访问您的系统和您的所有代码,但这是一个非常难以解决的问题。这就是说,你不会在你的问题中提供很多细节。
所以适用的Reducing SQL Server Deadlocks的一般规律:
您可能尝试将提示应用于读取行的查询:with(updlock,holdlock)。尝试创建一个在选择阶段使用的聚集索引,如果你没有的话。如果可能的话,尝试缩小事务处理的行数。
是否有可能首先更新表中的行,然后填充其他表?如果出现错误,您可以回滚事务。
我不建议使用NOLOCK提示,尤其是当您更新相同的数据时。
从我对Sql Server 2000的经验来看,热衷于死锁的最好方法是限制查询内部的并行性。 这可以通过添加两个查询(插入和SP)或者甚至只是在查询的末尾插入提示选项(Maxdop 1)来完成
这会限制性能,但是您可以安全执行。 如果只有一个线程正在运行,则没有其他可能会死锁的线程。
执行查询的线程之间的死锁不会经常发生。这里的问题是发生转换死锁,这是因为两个事务在资源(页面,行,表)上持有共享锁并尝试将这些锁转换为X锁来更新数据。设置MAXDOP选项在这里没有帮助。 – 2010-04-11 21:23:07