当我在管理工作室中执行以下 SQL 时,查询返回预期结果:
SELECT MAX(ID) FROM table WHERE field = value;
但是,当我的客户端应用程序(WinForms)在事务中间执行此 SQL 时,查询超时而不返回值。我怀疑这是因为 Transaction 包含其他 SQL 语句,这些语句正在添加/修改同一个“表”。
我该如何解决这个问题?
当我在管理工作室中执行以下 SQL 时,查询返回预期结果:
SELECT MAX(ID) FROM table WHERE field = value;
但是,当我的客户端应用程序(WinForms)在事务中间执行此 SQL 时,查询超时而不返回值。我怀疑这是因为 Transaction 包含其他 SQL 语句,这些语句正在添加/修改同一个“表”。
我该如何解决这个问题?
“SELECT MAX(ID)”是一个聚合函数,会在表上进行大量锁定——共享读锁可能会被用于表中的所有记录,当然是所有符合您条件的记录,以及其他取决于关于是否使用行锁或页锁。如果 MAX 想要锁定的任何这些记录上存在未完成的写锁定,则 MAX 将超时。您需要了解同时还有哪些其他锁。如果您使用的是 SQL Server,那么您可以使用 SQL Profiler 来获取跟踪,该跟踪将显示该表上的所有锁,包括来自其他事务的锁。
最后,我只是在事务开始之前使用 MAX 函数移动了 SQL 语句,并将值存储为变量以供以后在事务中使用。