在SQL Server数据库中,我有两个表,s和t。另一个链接表连接两者。这种关系是一对多的。
我有以下问题(按操作顺序:)
表t中更新的行未链接到表(2)正在查询的表中的ID。
两个SP的完成时间都比预期的要长,这意味着存在一些资源争用。 (2)在(1)完成之前完成,但似乎只从s上查看数据,而不是t。最后,(1)成功完成。没有报告死锁 - 我已根据SQL异常编号对这些进行了处理。
有什么想法?我想也许(1)获取的锁定停止(2)访问t上的视图,但(2)在(1)之前完成!
答案 0 :(得分:2)
感谢大家的回复。
事实证明发生了僵局!但是,存储过程会返回2个视图,其中只有第2个死锁。 SqlCommand
将这些视图返回到SqlDataReader
,使用带有传入的datareader方法委托的泛型方法读取。{/ p>
不幸的是,SqlDataReader
类中的错误(请参阅http://support.microsoft.com/kb/316667)阻止了死锁异常传播,因此未重试该操作。
我通过使用DataAdapter
课程来填充DataSet
而不是SqlDataReader
来解决这个问题。现在抛出了死锁,并且可以成功重试。
答案 1 :(得分:0)
您的交易隔离级别设置为什么?你桌子上的索引是什么?在表上执行SELECT
时,优化程序可能正在使用索引。执行INSERT/UPDATE/DELETE
时,数据库引擎需要维护该索引,这将导致性能开销。
您可以发布执行计划吗?
答案 2 :(得分:0)
听起来好像您正在使用允许脏读的事务隔离级别。要查找数据库的默认隔离级别,可以在该数据库中运行“DBCC useroptions”。这告诉您数据库的隔离级别,但请记住每个进程都可以设置隔离级别,因此请检查您的过程以查看是否正在为该查询使用隔离级别。注意READ UNCOMITTED,它允许“脏读”,读取数据的负面影响,而不考虑其他事务。
另外请记住,像NOLOCK这样的查询提示也会允许脏读。
有关隔离级别的更多信息,请访问: http://msdn.microsoft.com/en-us/library/ms189122.aspx
祝你好运!