Einzelnen Beitrag anzeigen

Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#1

MySQL / InnoDB: Tabelle richtig sperren

  Alt 13. Mai 2008, 16:06
Datenbank: MySQL • Version: 5.1 • Zugriff über: PHP
Hallo,

Ich programmiere derzeit eine Webseite mit PHP, welches ein Tausch-System implementiert.

Also ein Benutzer hat dort ein Objekt, das ihm in der Datenbank zugewiesen ist und kann es zum Tauschen anbieten. Das wird zum einen in der Tabelle mit den Tausch-Objekten vermerkt und auch ein Log-Eintrag erstellt mit Uhrzeit und Datum usw. wann und vom wem ein Objekt angeboten wurde.

Nun können andere Benutzer diese Objekte, falls sie für sie geeignet sind (dies wird anhand einiger Objekt-Kriterien entschieden und ist auch kein Problem), übernehmen. Dann wird in der Tabelle mit den Tausch-Objekten der Besitzer auf den neuen Benutzer übertragen und ein Log-Eintrag erstellt, dass das Objekt übernommen wurde.

Das ganze läuft ca. so ab (Pseudocode)
Code:
1.) Prüfen ob Objekt geeignet (u.A. ob überhaupt zum Tausch freigegeben)
2.) Log-Daten schreiben
3.) Besitzer des Objektes auf eigene Person ändern (damit wird die Tauschfreigabe gelöscht)
Soweit, so gut. Jedoch stellt sich nun das Problem, falls zwei Benutzer gleichzeitig versuchen ein zum Tausch freigegebenes Objekt zu übernehmen und nun der Fall eintritt, dass beide Ausfürhungspunkte beispielsweise kurz hintereinander bei Punkt 2) liegen. Dann würde der Tausch-Quasi doppelt vorgenommen (das Tausch-Objekt erhält der "letzte" Benutzer und der Eintrag im Log ist doppelt).

Dem wollte ich entgegenwirken, indem ich die betreffenden Tabellen vor 1) sperre und dann am Ende (nach 3)) wieder entsperre.
Ein Benutzer der dann "gleichzeitig" übernehmen will, muss dann beim Anfordern des LOCK warten und würde dann bei Prüfung bei 1) vertröstet, da das Objekt dann ja schon vergeben ist.

Nun sind die Tabellen aber InnoDB und laut der MySQL Dokumentation sollte man AUTOCOMMIT = 0 vor einer Sperre setzen.

Meine Frage ist, ob es okay ist das so zu machen:
Code:
a) AUTOCOMMIT = 0
b) LOCK Objekt-Tabelle READ/WRITE, Log-Tabelle READ/WRITE (evtl. andere Tabellen auch noch)
1.) ... 2.) ... 3.) ...
c) UNLOCK
d) AUTOCOMMIT = 1
Wirkt sich das AUTOCOMMIT nur auf den aktuellen Thread aus oder auch auf weitere Benutzer, die andere Bereich der Seite ansteuern und andere Daten (außerhalb der beteiligten Daten ändern)? Ist das vorhaben so realisierbar oder gibt es gar eine "bessere" Möglichkeit das Umzusetzen?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat