代码之家  ›  专栏  ›  技术社区  ›  hadi teo

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

  •  8
  • hadi teo  · 技术社区  · 14 年前

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

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

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

    2 回复  |  直到 7 年前
        1
  •  23
  •   Mitch Wheat    7 年前

    不,不是真的。

    try/catch 和手柄 SqlException 数字 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 
                ...
            }
        }
    

    [注:未为紧凑性添加中断语句

    另请注意

        2
  •  0
  •   IMHO    14 年前

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

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