AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MySQL / InnoDB: Tabelle richtig sperren
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL / InnoDB: Tabelle richtig sperren

Ein Thema von mirage228 · begonnen am 13. Mai 2008 · letzter Beitrag vom 15. Mai 2008
Antwort Antwort
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
Benutzerbild von mirage228
mirage228

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

Re: MySQL / InnoDB: Tabelle richtig sperren

  Alt 15. Mai 2008, 14:28
*PUSH*
David F.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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