Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Frage zu Transaktionen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Frage zu Transaktionen


 
lx-club
27-08-2010, 23:56 
 
Hi,

ich möchte Daten in verschiedene Tabellen schreiben, wobei z.B. die eingefügte Id aus der einen Tabelle in eine andere Tabelle geschrieben wird. Es muss sichergestellt werden das alle Abfragen erfolgreich sind und das eben die richtige zuletzt eingefügte ID eingetragen wird (nicht die eines anderen Schreibvorgangs in die Tabelle).
sind dafür Transaktionen geeignet oder gibt es dazu andere Möglichkeiten? Ich muss ja dazu auf InnoDb umschalten. Gibt es größere Nachteile im Vergleich zu Myisam? (auch im Hinblick auf Geschwindigkeit, Joins)

 
combie
28-08-2010, 00:01 
 
Warum reicht dir mysql_insert_id() nicht?
Oder das MySQL LAST_INSERT_ID()?

 
lx-club
28-08-2010, 00:12 
 
Es sind ja mehrere Tabellen betroffen mit verschiedenen Insert-Statements. Wenn bei einer Abfrage etwas schiefgeht wird die Datenbank doch inkonsistent. Das wollte ich vermeiden. Wenn mehrere User zugleich Abfragen auslösen, ist denn dann auch immer sichergestellt, das mit mysql_insert_id() auch wirklich die richtige ID zurückgegeben wird?

 
combie
28-08-2010, 00:28 
 
ist denn dann auch immer sichergestellt, das mit mysql_insert_id() auch wirklich die richtige ID zurückgegeben wird?
Es gibt eine Ausnahme:
mysql_insert_id() liefert 0, wenn die vorhergehende Abfrage keinen AUTO_INCREMENT Wert erzeugt hat.
aus dem PHP Handbuch....

Aus dem MySQL Handbuch:
Die erzeugte Kennung wird auf dem Server verbindungsspezifisch gehandhabt: Der von der Funktion an einen bestimmten Client zurückgegebene Wert ist der erste AUTO_INCREMENT-Wert, der für die zuletzt abgesetzte Anweisung, die eine AUTO_INCREMENT-Spalte betraf, von diesem Client erzeugt wurde. Dieser Wert darf nicht von anderen Clients bearbeitet werden, auch wenn diese selbst AUTO_INCREMENT-Werte erzeugen. Dieses Verhalten gewährleistet, dass jeder Client seine eigene Kennung abrufen kann, ohne die Aktivitäten anderer Clients berücksichtigen oder Sperren setzen bzw. Transaktionen verwenden zu müssen.

Und sicherlich sind Transaktionen zusätzlich sinnvoll bei Insert Kaskaden mit Abhängigkeiten..

 
lx-club
28-08-2010, 11:03 
 
Ich habe im Netz gar nicht so viel zu den Transaktionen gefunden.
Muss man denn nach jedem query prüfen ob ein Fehler aufgetreten ist oder kann man erst alles ausführen und dann einmalig schauen, ob es einen Fehler gab, also z.B.


Insert 1
Insert 2

if (fehler) rollback
else commit

 
combie
28-08-2010, 11:32 
 
Logik, einfach nur mal logisch denken....

Warum würdest du nach einem fehlgeschlagenen Insert noch weitere absetzen wollen?
Wozu?
Welchen Sinn soll das haben?

 
lx-club
28-08-2010, 13:45 
 
Natürlich will ich nach einem fehlegeschlagenen Insert keinen weiteren absetzen, das ja logisch.
Ich hatte das auf Transaktionen bezogen, das wenn ein query fehlschlägt alles wieder zurückgesetzt wird ohne das ich nach jedem query prüfen muss.
Deswegen hatte ich ja gefragt wie das mit den Transaktionen funktioniert.

 
combie
28-08-2010, 14:20 
 
das wenn ein query fehlschlägt alles wieder zurückgesetzt wird ohne das ich nach jedem query prüfen muss.
Automatisch?

Die Anweisungen START TRANSACTION und BEGIN starten eine neue Transaktion. COMMIT übergibt die aktuelle Transaktion, macht also die entsprechenden Änderungen permanent. Mit ROLLBACK machen Sie die laufende Transaktion rückgängig, d. h., alle Änderungen werden zurückgenommen.
Aus: MySQL :: MySQL 5.1 Referenzhandbuch :: 13.4.1 BEGIN/COMMIT/ROLLBACK (http://dev.mysql.com/doc/refman/5.1/de/commit.html)

Also, ich finde die Aussage im Handbuch recht eindeutig....

 
onemorenerd
28-08-2010, 14:21 
 
Hier (http://dba.fyicenter.com/faq/mysql/mysql_sql_transaction_management.html) werden die üblichen Fragen zu Transaktionen in MySQL beantwortet. Im Wesentlichen musst du START TRANSACTION bzw. BEGIN ausführen, gefolgt von deinen INSERT-Statements und dann entweder COMMIT oder ROLLBACK, abhängig davon ob die INSERTS zu deiner Zufriedenheit ausgeführt wurden.
Dabei ist zu beachten, dass MySQL nur dann automatisch die Transaktion abbricht und ROLLBACK macht, wenn Locking-Fehler auftreten. Sollte ein INSERT z.B. wegen Duplicate Key Entry fehlschlagen, macht MySQL einfach weiter. Du kannst aber mit
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND ROLLBACK;
dafür sorgen, dass bei einem Fehler ein ROLLBACK ausgeführt wird. Willst du deine Applikation/PHP auch wissen lassen, dass wegen eines Fehlers abgebrochen wurde, solltest du
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN ROLLBACK; CALL ERROR_ROLLBACK_OCCURRED; END;
verwenden. Dieses Statement musst du natürlich vor deinen INSERTS absetzen.

Soweit die Theorie, wenn ich das Manual richtig verstanden habe. Ausprobiert habe ich das noch nie.


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:28 Uhr.