Sperren einer MySQL-Datenbank, so dass nur eine person auf einmal kann eine Abfrage ausführen?
Habe ich ein paar Probleme, wenn Menschen versuchen, Zugriff auf eine MySQL-Datenbank und Sie werden versuchen, zu aktualisieren Tabellen mit den gleichen Informationen.
Habe ich eine Webseite geschrieben mit PHP. In dieser Webseite ist eine Abfrage um zu überprüfen, ob bestimmte Daten schon in die Datenbank eingegeben. Wenn sich die Daten nicht, dann kann ich gehen, um es einzufügen. Das Problem ist, dass, wenn zwei Menschen versuchen gleichzeitig, die überprüfung kann sagen, dass die Daten noch nicht eingegeben, aber wenn das einfügen erfolgt, es wurde von der anderen person.
Was ist der beste Weg, um dieses Szenario zu behandeln? Kann ich die Datenbank sperren zu verarbeiten nur meine Fragen, zuerst, dann anothers?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du suchst
LOCK
.http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
Diese ausgeführt werden kann, da eine einfache
mysql_query
(oderMySQLi::query/prepare
).Ich würde sagen, es ist besser, zu sperren, die bestimmte Tabellen (obwohl Sie wahrscheinlich versuchen
LOCK TABLES *
), die gesperrt werden müssen, anstatt die gesamte Datenbank - denn nichts wird in der Lage sein zu Lesen. Ich glaube, Sie suchen nach etwas wie:Oder in PHP:
Lesen, auf Datenbank-Transaktionen. Das ist wahrscheinlich ein besserer Weg zu behandeln, was Sie brauchen, als die Ausführung von LOCK TABLES.
Manuell sperren von Tabellen ist die schlechteste denken, dass Sie jemals tun könnte. Was passiert, wenn der code zum entsperren Sie nie läuft (weil die PHP fehlschlägt oder der Benutzer als Nächstes klickt der nächste Schritt, geht Weg vom PC, etc).
Einen Weg, dieses zu minimieren, die in eine web-app, und ein häufiger Fehler, die devs tun, ist, haben Sie ein datagrid-voller Textfelder, die Daten zu Bearbeiten, mit einer save-button pro Zeile oder die gesamte Tabelle. Natürlich, wenn die person öffnet diesen Freitag und kommt wieder Montag, die Daten könnten falsch sein, und Sie könnten das speichern von neuen Daten. Eine einfache Möglichkeit um dies zu beheben, stattdessen EDIT-buttons auf jeder Zeile, und klicken auf den button lädt dann eine Bearbeitungs-Formular, so sind Sie hoffentlich laden Sie neue Daten, und können uns nur 1 Zeile ändern zu einem Zeitpunkt.
Aber noch wichtiger ist, sollten Sie ein datetime-Feld als hidden-input Feld, und wenn Sie versuchen, zu senden die Daten aufs Datum schauen und entscheiden, wie alt die Daten sind und eine Entscheidung treffen, wie alt ist zu alt und zu warnen, oder zu verweigern, die Benutzer über Ihre Aktion.
Könnten Sie überprüfen, ob Daten geändert wurde, bevor Sie etwas Bearbeiten. In diesem Fall, wenn jemand Daten bearbeitet, während die andere person tut, seine Bearbeiten, wird er darüber informiert werden.
Art wie stackoverflow Griffe kommentieren.