8

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

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

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

4

2 回答 2

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

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

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

于 2010-04-27T06:52:49.327 回答
0

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

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

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

于 2010-04-27T13:28:06.200 回答