Reiner: MySQL und Transaktionen anwenden

Beitrag lesen

Hi,

Das Kernproblem liegt im "wie setzte ich Transaktionen richtig ein". Aber genau da versagen bisher alle Dokus die ich gefunden habe, ein konkretes Beispiel scheint keiner auf die Reihe zu bringen. Obwohl das doch "so einfach" ist.

ein konkretes beispiel wäre zum beispiel die überweisung bei einer bank. dort muss sichergestellt werden, dass das geld nicht nur auf dem ein konto abgeht, sondern auch auf dem anderen konto landet. ansonsten würde ja geld vernichtet, bzw. im positiven falle geld erzeugt werden. das wäre eine typische anwendung von transaktionen. der auftrag an das dbms ist, führe die transaktion ganz oder gar nicht durch.

nun ist es aber so, dass man hier nicht immer aktiv eingreifen muß, sondern das dbms übernimmt für dich diese aufgabe. tritt ein fehler auf, dann rollt es die ganze transaktion zurück, auch im dem falle, wenn in dem Programm ein Commit am ende steht. wenn du also ein transaktion ausführen willst, kannst du am ende ohne einschlechtes gewissen ein commit eingeben, ja viele anweisungen an ein dbms haben sogar ein auto-commit.

nein, ich denke, das war nicht die Frage!
Wenn es innerhalb einer Transaktion zum Absturz des Rechners/der DBMS kommt, so wird die Transaktion beim erneuten Hochfahren einem Rollback unterzogen. Dies passiert automatisch und bedarf keines Eingriffs.

Das genannte Szenario war aber, so wie ich es verstanden hatte, ein anderes:

Ein Datensatz aus A soll nach B verschoben werden, d.h. lese Daten aus A, speichere sie in B und lösche aus A.
Wenn jetzt ein zweiter Prozeß das gleiche macht, so kann dieser aus A lesen, in B speichern aber u.U. nicht mehr aus A löschen, weil der Datensatz nicht mehr in A vorhanden ist. Er wurde schon von dem ersten Prozeß gelöscht.
Dies führt zu einem SQL-Fehler (das Löschen aus A schlägt fehl), aber die Transaktion sollte dennoch abgeschlossen werden.

Wenn ich das richtig sehe, sollte somit der Datensatz aus A gelöscht sein, aber es bestehen zwei Datensätze in B (sofern nicht unique).

Man muß dann wohl per Hand einen Rollback veranlassen, sobald ein SQL-Statement fehlschlägt oder man setzt ein Lock.

siehe auch http://dev.mysql.com/doc/mysql/en/innodb-transaction-model.html

Gruß
Reiner