如何在不使用catchexception的情况下从.NET应用程序检测sql server超时

在我当前的应用程序中,我通过调用T-SQL Update命令执行更新。 问题是当时其他用户锁定了同一记录。

在.NET应用程序中,应用程序将等待SQL Server超时,然后它将抛出SqlException超时。

是否可以首先检查特定记录是否被其他进程锁定而不是捕获exception?

不,不是真的。

标准方法是使用try/catch并处理SqlException Number 1205 (死锁牺牲品), SqlException试您的查询:

  try { // do stuff... } catch (SqlException sqlEx) { switch (sqlEx.Number) { case -2: // Client Timeout case 701: // Out of Memory case 1204: // Lock Issue case 1205: // >>> Deadlock Victim // handle deadlock break; case 1222: // Lock Request Timeout case 2627: // Primary Key Violation case 8645: // Timeout waiting for memory resource case 8651: // Low memory condition ... } } 

[注意:没有为紧凑性添加break语句

另请注意 ,通过提供适当的覆盖索引可以消除许多锁定问题。

您可以使用具有非常短的超时的单独连接来尝试通过更新某些字段来锁定记录,但这仍然不会给您100%的可靠性。

如果您真的遇到多个用户编辑相同记录的情况,您应该研究乐观锁定技术。

此外,请确保您根本不允许用户锁定记录 – 使用断开连接模式进行任何更新。 换句话说,锁定只会在短时间内发生(<100 ms)