Synchronisierung (?) von MySql Zugriffen
mau
- php
0 Andreas Korthaus0 mau0 Andreas Korthaus0 mau
Hallo,
ich habe ein Forum auf PHP/MySql Basis gebaut.
Bis jetzt funktioniert auch alles ganz gut, jedoch gibt es einen Scriptteil, den ich für fehleranfällig halte.
Um die Beiträge auszugeben benutze ich eine Baumstruktur.
Wenn ich also einen Beitrag hinzufüge, so muß ich in den, von dem neuen Beitrag abhängigen Einträgen Änderungen vornehmen.
Dies kann ich aber nicht mit einem Befehl machen, daß heißt, ich ändere die Einträge in mehreren Schritten.
Wenn nun aber fürchterlicher Verkehr in meinem Forum herrschen würde und jemand auf einen Eintrag antwortet, während dieser gerade geändert wird (Änderung nicht abgeschlossen), könnte meine Datenbankstruktur mächtig durcheinander geraten.
Kann ich den Zugriff auf die Datenbank für die Zeit der Aktualisierung sperren, bzw. sollte ich das?
Wie arbeitet Sql, bzw. PHP, bzw. der Server diese Anfragen ab?
Leider habe ich bisher nichts gefunden, was mir Aufschluß über mein Problem geben könnte. Das liegt sicherlich daran, daß ich nicht weiß, wie ich die Frage, die ich habe, in wenigen Worten beschreiben kann.
Wenn mir jemand einen Tipp geben kann, wo ich über die Problematik, sofern sie einigermaßen transparent geworden ist, etwas lesen kann, so würde ich mich sehr darüber freuen.
Wenn mir jemand direkt einen Tipp geben kann, verhielte es sich ebenso.
Danke.
Hi!
Um die Beiträge auszugeben benutze ich eine Baumstruktur.
Wenn ich also einen Beitrag hinzufüge, so muß ich in den, von dem neuen Beitrag abhängigen Einträgen Änderungen vornehmen.
Wieso? Das muss nicht sein. Normalerweise macht man den neuen Eintrag von _einem_ Vater-Posting abhängig, zumindest wenn es sich hierbei um eine Antwort handelt.
Dies kann ich aber nicht mit einem Befehl machen, daß heißt, ich ändere die Einträge in mehreren Schritten.
Wenn nun aber fürchterlicher Verkehr in meinem Forum herrschen würde und jemand auf einen Eintrag antwortet, während dieser gerade geändert wird (Änderung nicht abgeschlossen), könnte meine Datenbankstruktur mächtig durcheinander geraten.
Daher solte das unbedingt vermieden werden. Wenn Du bei Deinem Ansatz bleiben wilst solltest Du Dich mal mit dem (My)SQL-Befehl "LOCK" auseinandersetzen, um für die Zeit Deiner Transaktion Zugriffe auf die Tabelle(n) zu beeinflussen.
Aber ich würde Dir empfehlen mal das ganze Konzept etwas zu überdenken, helfen wird Dir hierbei sicher folgender Featured Artikel: http://aktuell.de.selfhtml.org/artikel/phpasp/php-forum/index.htm
Kann ich den Zugriff auf die Datenbank für die Zeit der Aktualisierung sperren, bzw. sollte ich das?
Ja, s.o.
Wie arbeitet Sql, bzw. PHP, bzw. der Server diese Anfragen ab?
In der Folge wie sie eintreffen, es sein denn Du sperrst die Tabelle ("LOCK").
Grüße
Andreas
Hallo,
zunächst einmal vielen Dank für die Antwort.
Um die Beiträge auszugeben benutze ich eine Baumstruktur.
Wenn ich also einen Beitrag hinzufüge, so muß ich in den, von dem neuen Beitrag abhängigen Einträgen Änderungen vornehmen.
Wieso? Das muss nicht sein. Normalerweise macht man den neuen Eintrag von _einem_ Vater-Posting abhängig, zumindest wenn es sich hierbei um eine Antwort handelt.
Hierzu muß ich bemerken, dass ich mich wahrscheinlich mißverständlich geäußert habe.
Vom "Ansatz" her unterscheidet sich mein Forum nicht von dem von Henryk Plötz (danke für den Link).
Das Problem, das ich habe, oder das ich meine zu haben, spricht auch er an:
Das Anlegen eines neuen Threads enthält einen kleinen Trick: Die Thread-ID ist nicht bekannt, da sie ja der Eintrags-ID entsprechen soll, und diese von MySQL erst beim Schreiben in die Datenbank vergeben wird. Daher muss der neue Eintrag erstmal ohne Thread-ID geschrieben werden, die vergebene Eintrags-ID gelesen und dann die Thread-ID vom Eintrag der gemerkten Eintrags-ID auf die gemerkte Eintrags-ID gesetzt werden.
Genau dort sitzt mein Zweifel.
Es sind zwar "nur ein paar Millisekunden", aber es ist eine Zeitspanne, in der erst einmal ein Beitrag in die Datenbank geschrieben wird, um ihn dann, anschließend, zu aktualisieren.
Also ist in diesem kurzen Moment die DB nicht im gewünschten Zustand.
Kann da nicht was durcheinander kommen?
Ich habe die Vermutung, dass sich dieses Problem nicht vermeiden läßt, also werde ich mal weitersehen, was der "LOCK" Befehl so bewirkt.
Nochmal vielen herzlichen Dank für Deine Antwort.
Hi!
Genau dort sitzt mein Zweifel.
Es sind zwar "nur ein paar Millisekunden", aber es ist eine Zeitspanne, in der erst einmal ein Beitrag in die Datenbank geschrieben wird, um ihn dann, anschließend, zu aktualisieren.
Lies doch weiter:
"Das klingt erstmal kompliziert, lässt sich in MySQL aber recht einfach lösen:
UPDATE Forum SET TID=ID, Zeitpunkt=Zeitpunkt WHERE ID=LAST_INSERT_ID().
Diese simple Abfrage erledigt das schon: Die Tabelle Forum wird aktualisiert, und zwar an der Stelle, wo wir zuletzt eingefügt haben (LAST_INSERT_ID()). Dort wird die TID auf die ID gesetzt."
LAST_INSERT_ID() bezieht sich immer auf den letzten Eintrag der aktuellen Verbindung, lies mal: http://www.mysql.com/doc/en/Getting_unique_ID.html
Grüße
Andreas
Hallo Andreas,
danke für Deine Geduld.
Lies doch weiter:
"Das klingt erstmal kompliziert, lässt sich in MySQL aber recht einfach lösen:
UPDATE Forum SET TID=ID, Zeitpunkt=Zeitpunkt WHERE ID=LAST_INSERT_ID().
Ok, entschuldige. Ich hatte das LAST_INSERT_ID nicht so richtig kapiert, bzw. überlesen.
Ich hatte mir als Ersatz ein "manuelles", in meinen Augen zugegebenermaßen etwas schwindliges Konstrukt ausgedacht, um meine (bisher) fehlende Kenntnis des Befehls auszugleichen.
Bin jetzt schlauer, danke vielmals.