Hi
Ich habe mir eine wunderschöne Änderungsfunktion für meine mySQL-DB in PHP geschrieben. Funktioniert auch super - nur möchte ich jetzt den Datensatz bevor ich in den Änderungsmodus gehe sperren um keine race conditions zu riskieren. Leider habe ich bis jetzt noch keine Möglichkeit dazu gefunden. Geht das bei mySQL überhaupt der muss ich mir da selbst was basteln. Hoffe es kann mir jemand von euch helfen.
Record Locking funzt bei mySQL nur wenn du den InnoDB-Tablehandler (http://www.mysql.com/doc/I/n/InnoDB_overview.html) verwendest ... :
schau mal nach SELECT ... FOR UPDATE (http://www.mysql.com/doc/S/E/SELECT.html)
sonst gibt's nur 'n Table locking ... :
mit LOCK TABLES ... (http://www.mysql.com/doc/L/O/LOCK_TABLES.html)
Alternativ kannst du natürlich eine zusätzliche Spalte LOCK tinyint unsigned(1) einfügen.
Das mit der LOCK-Spalte verstehe ich jetzt nicht ganz. Nehme an du meinst sobald ich in den Änderungsmodus gehe die Spalte auf 1 setzen und wenn ich fertig bin wieder auf 0. Aber damit verlagere ich das Problem ja nur vom Datensatz auf die Spalte. Oder habe ich da jetzt etwas falsch verstanden.
Hi
Wieso Spalte ?
Es ist so gemeint, dass du wenn du eine Zeile Locken willst - eine 1 reinschreibst - wenn nicht eine 0
So dann machst du bei allen anfragen ein WHERE LOCK=0 - dann werden nur die Zeilen gelesen die LOCK == 0 sind.
Gruß
Tago
Das ist mir schon klar - aber damit löse ich das Problem ja nicht. Bsp.: 1. Client macht seine Abfrage - bekommt sein Ergebniss und setzt den Befehl ab um LOCK auf eins zu setzen. In diesem Moment wird er unterbrochen.
2. Client macht seine Abfrage - bekommt sein Ergebniss und setzt die selbe Zeile auf LOCK da ja Client 1 dabei unterbrochen wurde - geht in den Änderungsmodus.
Client 1 kommt wieder dran setzt die Zeile auf LOCK und geht in den Änderungsmodus. Ergebniss - beide Clients sind im Änderungsmodus für den selben Datensatz (race condition).