Original geschrieben von Gaert
Eine wichtige Eigenschaft von Transaktionen ist, dass Sie "atomar" ablaufen...
Die Transaktionen werden gegenüber anderen Transaktionen wie ein Einziger Befehl ausgeführt, ohne dass andere Transaktionen dazwischenpfuschen können.
Für deine Anwendung Spielt das aber keine Rolle... SELECT Abfrageergebnisse erhälst du sofort
Genau da liegt das Problem. Da die Ausführung des UPDATE-Queries bei meiner Anwendung von dem Ergebnis des SELECTs abhängt kann das ganze nicht funktionieren, wenn man die Ergebnisse der SELECT-Queries sofort kriegt.
Ich habe das ganze nochmal mit zwei mysql-Clients an einer InnoDB-Tabelle ausprobiert und den Consoleninhalt nebeneinander gepackt (ich habe die gleichen Befehle immer auf beiden Consolen nacheinander angewendet):
Code:
mysql> SET AUTOCOMMIT=0; 1. Befehl mysql>
Query OK, 0 rows affected (0.00 sec) mysql>
mysql>
mysql> mysql> SET AUTOCOMMIT=0; 2. Befehl
mysql> Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> START TRANSACTION; 3. Befehl - usw.... mysql>
Query OK, 0 rows affected (0.00 sec) mysql>
mysql>
mysql> mysql> START TRANSACTION;
mysql> Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> SELECT `blubb` FROM `__bla`; mysql>
+-------+ mysql>
| blubb | mysql>
+-------+ mysql>
| 1 | mysql>
+-------+ mysql>
1 row in set (0.00 sec) mysql>
mysql>
mysql> mysql> SELECT `blubb` FROM `__bla`;
mysql> +-------+
mysql> | blubb |
mysql> +-------+
mysql> | 1 |
mysql> +-------+
mysql> 1 row in set (0.00 sec)
mysql>
mysql> UPDATE `__bla` SET `blubb`=`blubb`-'1'; mysql>
Query OK, 1 row affected (0.00 sec) mysql>
Rows matched: 1 Changed: 1 Warnings: 0 mysql>
mysql>
mysql> mysql> UPDATE `__bla` SET `blubb`=`blubb`-'1';
mysql> Query OK, 1 row affected (11.08 sec) << hier die 11 Sekunden Wartezeit
mysql> Rows matched: 1 Changed: 1 Warnings: 0
mysql>
mysql> COMMIT; mysql>
Query OK, 0 rows affected (0.00 sec) mysql>
mysql>
mysql> mysql> COMMIT;
mysql> Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> SELECT `blubb` FROM `__bla`;
+-------+
| blubb |
+-------+
| -1 | << und hier hat `blubb` einen negativen Wert, was ja eigentlich gerade verhindert werden sollte
+-------+
1 row in set (0.00 sec)
Wie man an den Zeitangaben sieht kriegte ich das SELECT-Ergebnis wirklich sofort während ich auf das UPDATE-Ergebnis 11 Sekunden warten musste (nämlich bis zum COMMIT in der anderen Console).
Damit komme ich also um ein "LOCK TABLE `__bla` WRITE" nicht herum :/
Lesezeichen