2017-01-02 2 views
-1

Ich habe eine C# Programm arbeitet mit einer SQL Server-Datenbank auf verschiedenen Client-PCs ausgeführt werden. Jetzt , erhalte ich diese Ausnahme, die [wenn nicht gefangen] meine Anwendung geschlossen:„Deadlock auf Schloss | Kommunikationspuffer Ressourcen“ Ausnahme in C#/SQLSERVER

Transaktion (Prozess-ID ...) wurde am Schloss blockiert | Kommunikations Pufferressourcen mit einem anderen Prozess, und wurden als das Deadlockopfer gewählt. Führen Sie die Transaktion erneut aus.

und der Stack-Trace zeigt, dass die Ausnahme hier passiert:

bei Gui.DB.sqlServerWrapper.MarkAsNonFreshSample (String Barcode, Int32 Devid)

Wo das genannte Verfahren ist dies :

Ich benutze den "Mux" Mutex exklusiven Zugriff auf die SQL-Verbindung " conn "weil mein Programm mehrere Threads hat.

Ich bin nicht eine komplexe Abfrage oder eine lange Transaktion mit (und ich denke, diese kurze Abfrage eine Transaktion, die ein Deadlock nicht dazu führen sollte. Bin ich falsch?).

Wo ist das Problem und wie soll ich es beheben?

+2

* * Entfernen Sie den Mutex und die globale Verbindung. Globale Verbindungen garantieren Deadlocks und können im Fehlerfall nicht wiederhergestellt werden. Verbindungen sollte so wenig Zeit wie möglich –

+0

Können Sie abrufen [die Deadlock Graph] offen bleiben (http://dba.stackexchange.com/questions/10644/deadlock-error-isnt-returning-the-deadlock-sql/10646# 10646) und es in deine Frage aufnehmen? –

Antwort

2

eine Verbindung wie das zu teilen, ist keine gute Praxis

public void MarkAsNonFreshSample(string barcode, int devID) 
{ 
    using (SqlConnection con = new SqlConnection(conString)) 
    { 
     con.Open(); 
     using (SqlCommand command = con.CreateCommand()) 
     { 
      command.CommandText = "DELETE FROM results WHERE [email protected] AND [email protected]"; 
      command.Parameters.AddWithValue("barcode", barcode); 
      command.Parameters.AddWithValue("devID", devID); 
      command.ExecuteNonQuery(); 
     } 
    } 
} 
+0

Sie sind definitiv richtig. Aber (1) ist das das Problem? (2) Ich bin mit diesem Ansatz, weil Wenn meine Threads mit Datenbank ein zweites paar hundert Mal in Wechselwirkung treten und wenn ich öffnen und schließen Sie die Verbindung, wäre es wahrscheinlich kostete mich mehr – Akhir

+0

ich wiederhole. So eine Verbindung zu teilen ist ** nicht ** eine gute Übung. – Paparazzi

+1

@Akhir mit einer globalen lang laufenden Verbindung * und * ein Mutex wird große Probleme verursachen, egal was. Nur die lange laufende Verbindung reicht aus, um Sperren zu akkumulieren und Deadlocks zu verursachen. Alles, was Sie mit dieser Verbindung lesen, erhält eine Select-Sperre, was bedeutet, dass Sie beim ersten Mal, wenn jemand versucht, ein Update durchzuführen, einen Deadlock erhalten. –

Verwandte Themen