Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL / InnoDB: Tabelle richtig sperren (https://www.delphipraxis.net/113716-mysql-innodb-tabelle-richtig-sperren.html)

mirage228 13. Mai 2008 15:06

Datenbank: MySQL • Version: 5.1 • Zugriff über: PHP

MySQL / InnoDB: Tabelle richtig sperren
 
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

mirage228 15. Mai 2008 13:28

Re: MySQL / InnoDB: Tabelle richtig sperren
 
*PUSH*


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz