【问题标题】:SQL Transaction Times OutSQL 事务超时
【发布时间】:2012-11-15 16:26:06
【问题描述】:

当我在管理工作室中执行以下 SQL 时,查询返回预期结果:

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

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

我该如何解决这个问题?

【问题讨论】:

  • 看起来像死锁了。是否还有与同一张表相关的其他活动?
  • 死锁不会超时,但会导致死锁错误。然而,超时可能是由较早的阻塞锁引起的。
  • 您是否有权访问服务器/数据库上的活动监视器?您将能够看到您的冲突在哪里。
  • 你使用的是什么事务隔离级别?
  • 你想做什么?如果这是用于主键用途,它不会像你期望的那样工作......

标签: c# sql winforms transactions


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    最后,我只是在事务开始之前使用 MAX 函数移动了 SQL 语句,并将值存储为变量以供以后在事务中使用。

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多