ODBC-Transaktion
Timo
- php
Hallo alle zusammen,
ich habe folgendes Problem: Auf einer Datenbank soll folgende Transaktion durchgeführt werden:
1. Löschen aller Datensätze (Delete * from ...where key=...)
2. Einfügen neuer Datensätze eben dahin; per Schleife durch Array:
for ($i=0;$i<10;$i++) {
$sql = "insert into table ('sp1','sp2') values ($i,$afield[$i])";
odbc_exec($connection,$sql);
}
3. Das ganze noch innerhalb einer 2 Tabelle nochmal.
Das entweder komplett alles oder gar nichts ausgeführt werden soll brauche ich hier wohl nicht erst erwähnen.
Die geplante Umsetzung in PHP:
odbc_autocommit($connection,0); // disble AutoCommit
// alle Kommandos ausführen
for ($i=0;$i<10;$i++) {
$sql = "insert into table ('sp1','sp2') values ($i,$afield[$i])";
odbc_exec($connection,$sql);
}
// und weitere odbc_exec() hier
odbc_commit($connection);
Nach menschlichem Dafürhalten würde es auch laufen (unter ASP hat eine solche Lösung problemlos funktioniert) - hier werden alle Aktionen aber einzeln durchgeführt; nichts mit "Transaktion".
Wenn bspw. eine Tabelle gesprerrt ist und deshalb nicht geschrieben werden kann dürfte schlichtweg gar nichts passieren, ebenso wie beim Versuch, eine leere Zeichenfolge in ein Feld einzufügen, wo genau das nicht erlaubt ist.
Hat jemand eine Idee, was hier falsch läuft?
Danke
Timo
Hallo,
Nach menschlichem Dafürhalten würde es auch laufen (unter ASP hat eine solche Lösung problemlos funktioniert) - hier werden alle Aktionen aber einzeln durchgeführt; nichts mit "Transaktion".
Wenn bspw. eine Tabelle gesprerrt ist und deshalb nicht geschrieben werden kann dürfte schlichtweg gar nichts passieren, ebenso wie beim Versuch, eine leere Zeichenfolge in ein Feld einzufügen, wo genau das nicht erlaubt ist.
Hat jemand eine Idee, was hier falsch läuft?
Mit PHP kenn ich mich praktisch überhaupt nicht aus, aber so wie es aussieht, ignorierst Du konsequent, ob die odbc_exec-Aufrufe überhaupt erfolgreich waren. Sprich, Dir fehlt ein Errorhandling. Ich weiß nicht, wie das in PHP gehen würde, aber ich denke doch, daß odbc_exec einen Rückgabewert hat, an dem Du überprüfen kannst, ob der aktuelle Aufruf funktioniert hat. Wenn nicht, dann müßtesofort ein rollback erfolgen und alle nachfolgenden Aktionen nicht ausgeführt werden.
Wenn gar nichts anderes geht, dann kannst Du ja zwei Funktionen schreiben, eine die die Transaktion starten und, je nach Erfolg ein commit oder ein rollback absetzt, und eine, die von der ersten aufgerufen wird, die die eigentliche Arbeit erledigt und das immer mit sowas Ähnlichem wie
if(odbc_exec(...) == FEHLER)
{
return(-1);
}
....
nach dem letzten, erfolgreichem exec gibts dann ein
return(0);
Den Rückgabewert kannst Du dann für commit oder rollback auswerten.
Grüße
Klaus