SELECT输出两个视图:第二个视图被UPDATE阻止但成功返回?

时间:2011-11-01 17:42:07

标签: sql sql-server locking

在SQL Server数据库中,我有两个表,s和t。另一个链接表连接两者。这种关系是一对多的。

我有以下问题(按操作顺序:)

  1. 更新存储过程从表t开始。
  2. 从id存储过程开始选择,从表t上的视图和表s上的视图中选择。
  3. 表t中更新的行未链接到表(2)正在查询的表中的ID。

    两个SP的完成时间都比预期的要长,这意味着存在一些资源争用。 (2)在(1)完成之前完成,但似乎只从s上查看数据,而不是t。最后,(1)成功完成。没有报告死锁 - 我已根据SQL异常编号对这些进行了处理。

    有什么想法?我想也许(1)获取的锁定停止(2)访问t上的视图,但(2)在(1)之前完成!

3 个答案:

答案 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

祝你好运!