Laden...

Unregelmäßige Deadlocks - optimale Lösung?!

Erstellt von eveN vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.804 Views
E
eveN Themenstarter:in
107 Beiträge seit 2008
vor 14 Jahren
Unregelmäßige Deadlocks - optimale Lösung?!

verwendetes Datenbanksystem: SQL Server 2005 Express

Guten Morgen!

Ich komme gleich zur Sache:

Meine Anwendung arbeitet mit ServiceBroker. Ungefähr 30 Clients arbeiten mit einer Tabelle, wobei ca. alle 2-3 Minuten Daten geändert werden. Updatet also ein Client diese Tabelle, werden alle anderen Clients mehr oder weniger gleichzeitig von der DB informiert und laden sich automatisch via

sqlDataAdapter.Fill(dataSet, TabelleName);

die aktualisierte Version der Tabelle in ein DataSet (DataSet deswegen, weil zusätzlich noch eine weitere Tabelle geladen wird, welche aber nicht via ServieBroker überwacht wird). Die Tabelle selbst ist nicht sonderlich groß. Sie hat ca. 20 Spalten und die Zeilenanzahl variiert immer zwischen 0 und ~ 30.

Problem:
Es gibt Tage, an welchen alles prima läuft. Allerdings gibt es auch Tage, an denen am Tag mehrfach Deadlocks auftreten, wenn die Clients ihre Daten aktualisieren wollen:

Message:Die Transaktion (Prozess-ID 68) befand sich auf Sperre Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.

Scheinbar zufällig sind es dann im Laufe des Tages 3 oder mal eben 8 Clients, an welchen dann die Meldung kommt. Manchmal ist es sogar nur einer. Bei der nächsten Aktualisierung der Tabelle ein paar Minuten später tritt dann zu 99% aber kein Deadlock mehr auf und alles läuft ein paar Stunden einwandfrei. Es ist aber nur eine Frage der Zeit, bis der Deadlock wieder eintritt.

Nachdem ich jetzt so einiges gelesen habe, bin ich mir unsicher, wie ich das Problem am besten löse(n könnte), vorallem, weil ich die Deadlocks nicht ohne weiteres reproduzieren kann.
Hier im Forum sowe in meinen Büchern bin ich mehrfach über das SNAPSHOT-Isolation Level gestolpert, welches ja nicht mehr mit Locks arbeitet, sondern eine Versionsverwaltung führt. Da frage ich mich, ob das bei meinen ~30 Clients Sinn macht, oder nicht....

Hat da jemand Erfahrungswerte/Berichte?
Oder gar andere Vorschläge, das Problem anzugehen... ?

Ich könnte natürlich auch die betroffenen Transaktionen erneut ausführen, nur erscheint mir das irgendwie unsauber 😐

Besten Dank für jeden Tip!

eveN

Ich lasse mich gerne korrigieren! (:

Gelöschter Account
vor 14 Jahren

deadlocks spürt man am einfachsten so auf, indem man sich auf einem stück papier den ablauf aufzeichnet und dann schaut, wo es probleme geben könnte wenn nach jedem aufgezeichneten schritt, der selbe prozess nochmal parallel gestartet werden würde.

symptomatisch kannst du das problem für den kunden erstmal so lösen, das du die exception abfängst und nach einem kurzen sleep, die message einfach neu sendest.

1.564 Beiträge seit 2007
vor 14 Jahren

Hallo eveN

Ich würde - wenn möglich - auch die vorherige Aktion einfach nochmal ausführen. Das ist durchaus ein valides Vorgehen bei Deadlocks.

Isolation-Level auf Serializable bringt bei Deadlocks sehr viel, ist aber nicht 100% sicher. Allerdings wird die Menge der Deadlocks stark gegen 0 laufen.

Wenn du genauer wissen willst wer es war und was passiert ist würde ich mal den Profiler anwerfen und unter der Sektion "Locks" die entsprechenden Events aktivieren.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

E
eveN Themenstarter:in
107 Beiträge seit 2008
vor 14 Jahren

Hi,

danke für eure Antworten.

symptomatisch kannst du das problem für den kunden erstmal so lösen, das du die exception abfängst und nach einem kurzen sleep, die message einfach neu sendest.

Hallo eveN

Ich würde - wenn möglich - auch die vorherige Aktion einfach nochmal ausführen. Das ist durchaus ein valides Vorgehen bei Deadlocks.

Ja, da werd ich dann wohl auf die schnelle nicht drum herum kommen.

Den Profiler gibt's ja nicht für die Express Edition, oder?

Kurzes googlen hat gerade einen Profiler von "AnjLab" [link] für sql server 2005 express ausfindig gemacht, den werde ich dann mal testen!

Unabhängig von alledem hab' ich vorhin noch etwas von WITH(NOLOCK) gelesen, sprich z.B.

SELECT * FROM Tabelle WITH(NOLOCK)

Weis jemand, was es damit aufsich hat ?(

Danke & Gruß,

eveN

Ich lasse mich gerne korrigieren! (: