2009-07-10 17 views
6

Beim Ausführen einer gespeicherten Prozedur (von einer .NET-Anwendung), die ein INSERT und ein UPDATE ausführt, bekomme ich manchmal (aber nicht so oft, wirklich) und zufällig diesen Fehler :Sybase ASE: "Ihr Serverbefehl hat eine Deadlock-Situation festgestellt"

ERROR [40001] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]Your server command (family id #0, process id #46) encountered a deadlock situation. Please re-run your command.

Wie kann ich das beheben?

Danke.

+1

Weißt du, was ein Deadlock ist, warum ein Deadlock passieren kann ... und warum es * mit * deinem * Code passiert? Hast du versucht wie "Sybase" und "Deadlock" zu googlen? – ChrisW

+0

Ja ich weiß was es ist, ja ich habe gegoogelt. Die Sache ist, der Stillstand passiert sehr selten. Da die Abfrage einfach ist (ein Update und eine Einfügung), sollte sie im schlimmsten Fall vom Server * verzögert * werden, wenn eine andere Sperre sie blockiert, nicht einfach wegwerfen. Außerdem sagt der Fehler nicht, was der Deadlock war (welche Tabelle, Zeile usw.), was es schwierig macht, das Problem zu lösen. Ich kann nicht manuell verhindern, dass 2 Anfragen gleichzeitig auf dem Server ankommen! – Laurent

+1

Ein Deadlock verzögert nie andere Prozesse, es stoppt den anderen Prozess tot - ich würde mehr über Deadlocks lesen, da Sie kein Verständnis gezeigt haben – Mark

Antwort

0

Unter der Annahme, dass Ihre Tabellen ordnungsgemäß indiziert sind (und dass Sie tatsächlich diese Indizes verwenden - immer eine Überprüfung über den Abfrageplan wert), könnten Sie versuchen, die Komponenten des SP zu zerlegen und sie in separate Transaktionen zu verpacken Die Arbeit ist abgeschlossen, bevor die nächste beginnt.

begin transaction 
    update mytable1 
    set mycolumn = "test" 
    where ID=1 

commit transaction 
go 

begin transaction 
    insert into mytable2 (mycolumn) select mycolumn from mytable1 where ID = 1 
commit transaction 
go 
+0

Eigentlich hatte ich heute wieder das gleiche Problem, mit einer gespeicherten Prozedur, die nur eine einzige Anweisung (ein INSERT) enthält ... – Laurent

6

Ihre beste Wette für die Lösung Sie Ausgabe Deadlocks ist „print Deadlockinformationen“, um über die Verwendung

sp_configure „print Deadlockinformationen“ zu setzen, 1

Jedesmal eine Sackgasse ist dieser Druck wird Informationen darüber, welche Prozesse involviert waren und welche SQL zum Zeitpunkt des Dead Locks ausgeführt wurden.

Wenn Ihre Tabellen die Allseitensperrung verwenden. Es kann Deadlocks reduzieren, um zu Datarows oder Datenseitensperren zu wechseln. Wenn Sie dies tun, stellen Sie sicher, dass Sie neue Statistiken für die Tabellen erfassen und Indizes, Ansichten, gespeicherte Prozeduren und Trigger neu erstellen, die auf die geänderten Tabellen zugreifen. Wenn Sie dies nicht tun, erhalten Sie entweder Fehler oder sehen nicht die vollen Vorteile der Änderung, je nachdem, welche nicht neu erstellt wurden.

2

Ich habe eine Reihe von langfristigen Anwendungen, die gelegentlich über Tabellenzugriff und sybase wird diesen Fehler werfen. Wenn Sie das Sybase-Serverprotokoll überprüfen, erhalten Sie die vollständigen Informationen darüber, warum es passiert ist. Wie: Die SQL, die die beiden Prozesse beteiligt war, die versuchten, eine Sperre zu erhalten. Normalerweise versucht jemand zu lesen und der andere tut etwas wie ein Löschen. In meinem Fall laufen die Apps in separaten JVMs, also kann man nicht synchronisieren, sondern muss nur regelmäßig aufräumen.

Verwandte Themen