LukeWCS hat geschrieben: 25.09.2021 21:35
Der Punkt ist, deine/Crizzo's Idee hat bei mir beim testen für Verwirrung gesorgt, weil ein sql_transaction('commit') gar nicht notwendig war, die Queries wurden trotzdem ausgeführt.
Jein.
Wenn nach dem logischen Ende der SQL-Anweisungen einer Transaktion keine weiteren SQL-Anweisungen vor dem Schließen der Datenbankverbindung vorkommen, wäre ein
sql_transaction('commit')
nicht notwendig, da das Schließen der Datenbankverbindung auch immer ein
COMMIT
auslöst und damit die Datenbank eine begonnene Transaktion ausführen lässt.
Dennoch sollte man Transaktionen immer schnellstens und damit sauber mit einem
COMMIT
beenden, da bei einem Fehler zwischen dem logischen Ende der Transaktion und dem Schließen der Datenbankverbindung eine begonnene Transaktion eben nicht sofort ausgeführt wird.
Das kann auch ein simpler PHP-Fehler sein, da dieser die Datenbankverbindung nicht zwangsweise schließt und somit auch ein an dieser Stelle unerwünschtes
ROLLBACK
der bis dahin möglicherweise erfolgreichen Transaktion auslösen könnte.
Allerdings bin ich mir nicht sicher, ob eine Transaktion auch davor schützt, wenn damit ein neu aufzubauender Tabellen-Index ausgeführt werden soll. Schließlich ist eine Transaktion eher für die "üblichen" SQL-Abweisungen wie
DELETE
,
UPDATE
,
INSERT
oder
REPLACE
gedacht und weniger für ein
ALTER TABLE
oder gar ein
DROP INDEX
,
CREATE INDEX
,
ALTER INDEX
.
Wobei sich alle beliebigen SQL-Anweisungen in einer Transaktion zusammenfassen lassen. Und wenn diese logisch korrekt aufeinander aufbauen, sehe ich auch kein Problem, am Ende der logischen Transaktion auch einen Index neu zu setzen.
Dennoch:
Während der Index einer Tabelle in einer Transaktion bearbeitet wird, nimmt die Datenbank ja auch immer neue Befehle entgegen.
Aber was passiert dabei, wenn die Transaktion beendet ist und die geänderten Primärschlüssel nicht mehr zu den nachfolgenden SQL-Anweisungen passen?
Innerhalb einer Transaktion kann man das noch kontrollieren, aber die wartenden SQL-Anweisungen kennen den neuen Index nicht, wenn dieser in einer Transaktion geändert wurde.
Allerdings trifft dieses Problem auch bei einzeln ausgeführten SQL-Anweisung zu, welche einen Index manipuliert. Von daher gäbe es keinen Unterschied, ob ein Befehl für den Index innerhalb oder vor / nach einer Transaktion ausgeführt wird...
Allein daher wäre aber ein
COMMIT
der Transaktion wiederum sinnvoll, insbesondere, wenn ein Tabellen-Index geändert wird, um möglichst keine oder nur einzelne Folgefehler zu erhalten.