8

In meiner aktuellen Anwendung führe ich ein Update durch Aufrufen von T-SQL-Update-Befehl. Das Problem liegt vor, wenn derselbe Datensatz zu diesem Zeitpunkt von anderen Benutzern gesperrt wurde.wie SQL Server-Timeout von .NET-Anwendung ohne Verwendung von Catch zu erkennen Ausnahme

Bei .NET-Anwendung wartet die Anwendung bis SQL Server Timeout, dann wird das SqlException-Timeout ausgelöst.

Ist es möglich, zunächst zu prüfen, ob ein bestimmter Datensatz von einem anderen Prozess gesperrt ist, anstatt die Ausnahme abzufangen?

Antwort

22

Nein, nicht wirklich.

Der üblicher Weg ist try/catch zu verwenden und SqlException Nummer 1205 (Deadlockopfer) handhaben, und wiederholen Sie Ihre Frage:

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

[Hinweis: break-Anweisungen nicht für Kompaktheit hinzugefügt

Auch beachten Viele Sperrprobleme können durch Bereitstellung der entsprechenden Abdeckungsindizes beseitigt werden.

0

Sie könnten eine separate Verbindung mit einem sehr kurzen Timeout verwenden, um zu versuchen, den Datensatz zu sperren, indem Sie ein Feld aktualisieren, aber das wird Ihnen immer noch keine 100% ige Zuverlässigkeit geben.

Wenn Sie wirklich die Situation haben, in der mehrere Benutzer dieselben Datensätze bearbeiten, sollten Sie optimistische Sperrtechniken untersuchen.

Stellen Sie außerdem sicher, dass Sie Benutzern nicht erlauben, die Datensätze zu sperren - verwenden Sie den getrennten Modus für alle Updates. Mit anderen Worten, die Verriegelung tritt nur für eine kurze Aktualisierungszeit auf (< 100 ms)