Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erhält man eine effiziente Sql Server-Deadlock-Behandlung in C# mit ADO?

Zuerst würde ich meinen SQL 2000-Code überprüfen und der Ursache dieses Deadlocks auf den Grund gehen. Die Behebung dieses Problems kann ein größeres Problem verbergen (z. B. fehlender Index oder fehlerhafte Abfrage).

Zweitens würde ich meine Architektur überprüfen, um zu bestätigen, dass die Deadlocking-Anweisung wirklich so häufig aufgerufen werden muss (Wählt select count(*) from bob aus 100 Mal pro Sekunde angerufen werden müssen?).

Wenn Sie jedoch wirklich Deadlock-Unterstützung benötigen und keine Fehler in Ihrem SQL oder Ihrer Architektur haben, versuchen Sie etwas in der Art der folgenden Zeilen. (Anmerkung:Ich musste diese Technik für ein System verwenden, das Tausende von Abfragen pro Sekunde unterstützt, und stieß ziemlich selten auf Deadlocks)

int retryCount = 3;
bool success = false;  
while (retryCount > 0 && !success) 
{
  try
  {
     // your sql here
     success = true; 
  } 
  catch (SqlException exception)
  {
     if (exception.Number != 1205)
     {
       // a sql exception that is not a deadlock 
       throw; 
     }
     // Add delay here if you wish. 
     retryCount--; 
     if (retryCount == 0) throw;
  }
}