如何从.NET应用程序中检测到SQL Server超时而不使用catch异常

如何从.NET应用程序中检测到SQL Server超时而不使用catch异常

问题描述:

在我当前的应用程序中,我通过调用T-SQL Update命令来执行更新。问题是当时其他用户锁定相同的记录。如何从.NET应用程序中检测到SQL Server超时而不使用catch异常

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

是否可以首先执行检查,以确定特定记录是否被其他进程锁定,而不是捕获异常?

不,不是。

的标准方法是使用try/catch和处理SqlException1205(死锁牺牲品),然后重试查询:不添加紧凑break语句

还要注意

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 
      ... 
     } 
    } 

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

您可以使用单独的连接和很短的超时时间来尝试通过更新某个字段来锁定记录,但这仍然不会为您提供100%的可靠性。

如果你真的有多个用户编辑相同记录的情况,你应该看看乐观锁定技术。

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