PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [DBMS] Hattet ihr schonmal einen Transaktionsabbruch wg. Deadlock o.ä.?


mittelding
2011-01-31, 15:13:13
Hallo erstmal,

gerade experimentiere ich wieder etwas mit Datenbanken (genau genommen Oracle XE) herum, um mein Wissen von der Vorlesung damals aufzufrischen, wäre schade wenn das verloren geht.
Da fiel mir spontan eine Thematik ein, die ich damals so hingenommen, aber nicht weiter verfolgt habe. Jetzt würde ich es aber doch gern genauer wissen.

Im wesentlichen geht es um Transaktionsmanagement.. genauer gesagt um den Fall, dass bei Verfahren wie dem 2 Phasen Sperrprotokoll ein Deadlock eintritt oder bei Verfahren wie MVCC die Kopie nicht zurückgeschrieben werden kann.
Damals hieß es, dass in einem solchen Fall eine der beteiligten Transaktionen wohl oder übel abgebrochen werden muss.

Das hat mich damals irgendwie sehr verwundert oder gar geschockt. Das heißt ja im wesentlichen, dass ich als DB-Benutzer alles richtig gemacht haben kann, die Maschine auch alles richtig gemacht haben kann, und ansonsten auch keine anderen Einwirkungen wie Hard- oder Softwarefehler auftreten und meine Anfrage trotzdem abgebrochen wird.

Habe ich da was falsch verstanden oder ist das tatsächlich so möglich?
Klar, als einzelner User wird man einen solchen Fehler nicht provozieren können (bezüglich Threadtitel).. aber bei hochfrequentierten Datenbanken mit unzähligen Benutzern müsste es doch vom Gefühl her dauernd krachen.
Bisher habe ich auf Clientseite in Java oder PHP immer Datenbankfehler abgefragt, aber neben semantischen Dingen dachte ich bisher immer, dass eigentlich nur tatsächliche technische Fehler ein Problem darstellen. In diesem Fall habe ich dann eine Meldung ausgegeben a la "error, please try again later". Aber wenn das wirklich so ist wie oben beschrieben, dann erfordert dass ja eine ganz andere herangehensweise in der Fehlerbehandlung meinerseits. Schließlich kann man dem User ja kaum per Fehlermeldung an den Kopf werfen, dass mit der DB eigentlich alles in Ordnung ist, sie aber trotzdem gerade keine Lust hatte, die Transaktion des Users auszuführen.

Danke

AlecWhite
2011-01-31, 16:14:31
Bei mir gilt der Grundsatz "Always be prepared to re-issue a query." und das gilt auch für für Fehler im Fall eines DL.

Einen Fehler an den Anwender weiterzuleiten ist auch Software-design nur zweite Wahl. Besser ist es immer den Fehler abzufangen und zu reagieren und in deinen Fall lautet das Reagieren: Den Query nochmal durchführen.

Ectoplasma
2011-01-31, 17:05:13
Klar, als einzelner User wird man einen solchen Fehler nicht provozieren können (bezüglich Threadtitel).. aber bei hochfrequentierten Datenbanken mit unzähligen Benutzern müsste es doch vom Gefühl her dauernd krachen.
Danke

Nein warum sollte es dauernd krachen? Man muss sich ersteinmal überlegen, wie ein Deadlock überhaupt zustande kommen kann. Wenn man das getan hat, wird man festellen, dass es mit einer sauber aufgebauten Tabellen-Struktur und Abfragelogik kaum möglichlich ist, einen Deadlock auszulösen. Das es einen Lock geben kann, weil gerade ein anderer Query auf die gleiche Tablle wie ich zugreifen möchte, ist normal. Das ist aber kein Deadlock. In der Regel wartet eine Query dann, bis der Lock von der vorherigen Query durch das Beenden der Transaktion aufgehoben wird. Dieses Verhalten ist aber einstellbar. Entweder wartet die Query oder kehrt mit einem Fehler sofort wieder zurück. Ein Deadlock ist kein normales Anwendungsverhalten und deutet eher auf einen konzeptionellen Fehler in der Anwendung hin.