Hallo Zusammen,
hier habe ich nun eine weitere Frage bzgl. Datenbankschreiben. OXID hat schon eine schöne Lösung von Datenbankzugriffen geschafft (oxbase->save()!) Recht einfach. Aber was mir fehlt ist noch die transaktionelle Sicherheit - Sprich wenn ich zwei Tabellen habe, eine speichert eine Position in der Bestellung (oxorderarticle), eine speichert noch weitere Attributen zu dieser Position, da muss ich zwei Mal save() Methoden aufrufen, um in zwei Tabellen zu speichern, aber es soll beide funktionieren oder gar keine, typisch Datenbankkram.
Meine Frage ist dann wie mache ich es mit OXID’s DB Konzept? Habe ich die Möglichkeit die zwei save() Aufrufe zu einer Transaktion zu kombinieren? Danke.
VG, Ge
oxDb::startTransaction();
...
wird in oxorder.php benutzt.
Hi Frank,
danke für die schnelle Antwort. Nur noch zum besseren Verstehen: Es ist eine static Methode startTransaktion(), heisst es, es wird von dort an alle SQL Statements zu einer Transaktionen gefasst? Wenn mehrere Benutzer gleichzeitig ihre Orders änderen, bedeutet es, wenn einer fehlt, fehlen alle?
Irgendwie habe ich noch nicht ganz verstanden, wie es hier funktionieren kann. Falls Du es noch kurz erläutern könntest, wäre ich sehr dankbar.
VG, Ge
Jeder Benutzer hat ja seinen eigenen Script-Prozess und damit seine eigene oxDb-Klasse und DB-Verbindung. Bei einem Rollback werden dann alle von diesem Scriptaufruf getätigten SQL Statements seit startTransaction rückgängig gemacht.
Hi Frank, genau hier habe ich nicht verstanden - es wird die static Methode gerufen, die DB Instanz gilt dann doch für alle Script-Prozesse? Entschuldigung mal falls ich es nicht richtig verstanden habe, ich komme eigentlich aus Java-welt und mindestens da funktioniert so. Habe mich erst seit ein paar wochen mit PHP gefasst.
Gruss, Ge
Das ist bei PHP anders als bei Java, bei jedem Scriptaufruf startet alles von vorn, Klassen werden geladen, Instanzen erstellt, DB-Verbindung hergestellt etc. Nach dem Scriptablauf wird alles wieder zerstört. Das macht jeder Scriptaufruf einzeln, so wie wenn bei Java eine neue Instanz des Programms gestartet wird.
“Static” bedeutet in dem Fall nur, dass keine Instanz der Klasse benötigt wird. Es wird durch den Aufruf einfach über die bestehende Verbindung ein SQL-Kommando an die DB gesendet (‘START TRANSACTION’). Da jeder Scriptprozess eine eigene DB-Verbindung aufbaut, gilt dass dann nur für das aktuelle Script.
Vielen Dank Frank! Es hilft mir sehr! Bin schon ganz gespannt auf die PHP Welt, und hoffe bald kann ich auch hier etwas beitragen.
Gruss, Ge