2012-11-15 131 views
0

当我执行下面的SQL在Management Studio中的查询返回预期的结果:SQL事务超时

SELECT MAX(ID) FROM table WHERE field = value; 

然而,当我的客户端应用程序(的WinForms)执行的交易中的查询的中间这个SQL超时而不返回值。我怀疑这是因为事务包括其他SQL语句正在添加/修改相同的'表'。

我该如何解决这个问题?

+3

看起来像一个僵局。有没有其他活动与同一张桌子相关? – J0HN

+1

死锁不会超时,但会导致死锁错误。但是,超时可能是由较早的阻塞锁造成的。 – Polyfun

+1

你有权访问服务器/数据库上的活动监视器吗?你将能够看到你的冲突在哪里。 – TEEKAY

回答

2

“SELECT MAX(ID)”是一个聚集函数,它会对表进行大量锁定 - 共享读锁可能会在表中的所有记录上执行,当然在所有符合条件的记录上,而其他则取决于是使用行还是页面锁。如果在MAX想要锁定的这些记录的任何上存在未完成的写入锁定,则MAX将超时。您需要了解同时还有哪些其他锁。如果您使用的是SQL Server,那么您可以使用SQL Profiler来获取一条跟踪信息,该跟踪信息将向您显示该表上的所有锁,包括来自其他事务的锁。

0

最后,我简单地在事务开始之前使用MAX函数移动SQL语句,并将该值存储为变量,以便以后在转换中使用。