Komme gerade an meinen Problemen nicht wirklich weiter. Lange Suche und stöpern in diversen Dokus brachte mich auch nicht auf den Weg der Erkenntnis, so lege ich meine Hoffnung nun mal hier auf meine geistige Rettung :)
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. Ist der Vorgang ok, kommt ein COMMIT ansonsten ein ROLLBACK. Hmpf, entweder suche/finde ich falsch, oder ... ka.
So, mal (etwas) vereinfacht ein Problem an dem ich sitze.
Tabelle Warteliste und Teilnehmer, unter gewissen Kriterien kommt jmd nun aus der Warteliste in die Teilnehmer.
Als Transaktion ausgedrückt, wäre das ja:
START TRANSACTION;
SELECT FROM Warteliste ... WHERE ...
INSERT INTO Teilnehmer ...
DELETE FROM Warteliste ...
COMMIT;
Also bis hier ja noch recht einfach ^^. Nur, wie entscheide ich richtig ob ich nun wirklich ein COMMIT oder ein ROLLBACK setze.
Zunächst muss ja vielleicht mal klar werden, was schief gehen kann.
Also, gesetz dem Fall ich verstehe die Problematik richtig, könnte nun eine Transaction (1) den Eintrag herauslesen, welcher nun in die Teilnehmer übernommen wird, fast gleichzeitig liesst nun eine andere Transaction (2) auch diesen Eintrag. Mit dem Resultat, dass nun beide Transaktionen versuchen den Eintrag in Teilnehmer zu schreiben und anschliessend zu löschen.
Und (vielleicht hier) auch eine entscheidende Frage, brauch ich das überhaupt?
Für mich sieht das ja erstmal nach dem Sinn von Transaktionen aus, NUR wenn der Member sowohl in der einen Tabelle eingetragen wird als auch aus der anderen gelöscht wird, ist der Vorgang konsistent, aber ...
Da ich bei Teilnehmer eh ein UNIQUE auf Member_ID habe, _kann_ dieser keine 2x eingetragen werden, und gelöscht werden muss er ja auf alle Fälle (richtig?) egal ob er nun schon vorher in Teilnehmer stand, oder kein weiteres mal eingetragen werden kann (weil schon vorhanden).
Und, wie würde es dann wirklich in der Praxis aussehen?
Wie würde man auf Fehler prüfen?
START TRANSACTION;
SELECT FROM Warteliste ... WHERE ...
INSERT INTO Teilnehmer ...
DELETE FROM Warteliste ...
SELECT FROM Teilnehmer ... WHERE ... (als Kontrolle)
und dann falls eingetragen
COMMIT;
ansonsten
ROLLBACK?
Oder würde hier eine Transaktion sogar nach hinten losgehen?
D.h. eine 2 Transaction versucht nun fast gleichzeitig einzutragen, aber entscheidet, das ein Fehler aufgetraten ist und führt ein ROLLBACK durch, wird dann auch der gelöschte Eintrag auch wieder hergestellt? obwohl er ja in der ersten Transaktion stimmig gelöscht wurde?
Es gibt auch eine andere Stelle, wo ich auch am grübeln bin.
(Beim ersten Beispiel, quält mich ja die Frage, ob eine Transaktion überhaupt notwendig und sinnvoll ist, oder nicht eher eine "Integritätsprüfung" mit UNIQUE der richtige Weg ist)
Beispiel, ein Member bekommt TANs zum Werben von neunen Member. Jede TAN kann nur 1x verwendet werden und wird dann ungültig. Ein (korrekter) Vorgang wäre dann.
-> auslesen ob TAN noch gültig ist
-> TAN ungültig setzen
-> Provision gutschreiben
So, aber wie überprüfe ich ob _während_ ich festgestellt habe die TAN ist ok, bis zum ungültig setzen der TAN, nicht eine andere Transaktion das gleiche feststellt?. Mit dem Resultat, dass die Provision 2x gutgeschrieben wird.
gruss
Timo