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

had*_*teo 8 c# sql-server sql-server-2005 sql-server-2008 sql-server-2016

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

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

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

Mit*_*eat 23

不,不是真的.

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

    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 
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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