5 Stimmen

Sperren einer MySQL-Datenbank, damit nur eine Person gleichzeitig eine Abfrage ausführen kann?

Ich habe einige Probleme, wenn Leute versuchen, auf eine MySQL-Datenbank zuzugreifen, und sie versuchen, Tabellen mit denselben Informationen zu aktualisieren.

Ich habe eine Webseite mit PHP geschrieben. Auf dieser Webseite gibt es eine Abfrage, um zu prüfen, ob bestimmte Daten in die Datenbank eingegeben wurden. Wenn das nicht der Fall ist, füge ich die Daten ein. Das Problem besteht darin, dass, wenn zwei Personen gleichzeitig versuchen, die Daten einzugeben, die Prüfung möglicherweise anzeigt, dass die Daten noch nicht eingegeben wurden, aber wenn das Einfügen stattfindet, wurden sie von der anderen Person eingegeben.

Wie geht man am besten mit diesem Szenario um? Kann ich die Datenbank sperren, so dass nur meine Abfragen zuerst verarbeitet werden und dann die anderen?

5voto

Jason S Punkte 178087

Lesen Sie mehr über Datenbank-Transaktionen . Das ist wahrscheinlich ein besserer Weg, um das zu tun, was Sie brauchen, als LOCK TABLES auszuführen.

4voto

TravisO Punkte 9202

Das manuelle Sperren von Tabellen ist das Schlimmste, was Sie je tun könnten. Was passiert, wenn der Code zum Entsperren nie ausgeführt wird (weil PHP fehlschlägt oder der Benutzer den nächsten Schritt anklickt, sich vom PC entfernt usw.)?

Eine Möglichkeit, dies in einer Webanwendung zu minimieren, und ein häufiger Fehler, den Entwickler machen, besteht darin, eine Datentabelle voller Textfelder mit Daten zum Bearbeiten zu haben, mit einer Schaltfläche zum Speichern pro Zeile oder für die gesamte Tabelle. Wenn die Person diese Tabelle am Freitag öffnet und am Montag wiederkommt, könnten die Daten falsch sein und sie könnte neue Daten speichern. Eine einfache Möglichkeit, dies zu beheben, besteht darin, stattdessen in jeder Zeile eine Schaltfläche zum Bearbeiten einzubauen, und wenn man auf die Schaltfläche klickt, wird ein Bearbeitungsformular geladen.

Noch wichtiger ist jedoch, dass Sie ein Datumsfeld als verborgenes Eingabefeld einfügen. Wenn der Benutzer versucht, die Daten zu übermitteln, wird das Datum betrachtet und entschieden, wie alt die Daten sind, und es wird entschieden, wie alt zu alt ist, und der Benutzer wird gewarnt oder abgelehnt.

2voto

Ross Punkte 44536

Sie suchen nach LOCK .

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

Dies kann als einfache mysql_query (oder MySQLi::query/prepare ).

Ich würde sagen, es ist besser, bestimmte Tabellen zu sperren (obwohl Sie wahrscheinlich versuchen können LOCK TABLES * ), die gesperrt werden müssen, und nicht die gesamte Datenbank - denn dann kann nichts mehr gelesen werden. Ich denke, Sie suchen nach etwas wie:

LOCK TABLES items;
START TRANSACTION;
INSERT INTO items (name, label) VALUES ('foo', 'bar');
UNLOCK TABLES;

Oder in PHP:

mysql_query('LOCK TABLES items');
mysql_query("INSERT INTO items (name, label) VALUES ('foo', 'bar')");
mysql_query('UNLOCK TABLES');

0voto

Maiku Mori Punkte 7284

Sie könnten prüfen, ob Daten geändert wurden, bevor Sie etwas bearbeiten. Wenn in diesem Fall jemand Daten bearbeitet hat, während eine andere Person ihre Daten bearbeitet, wird sie darüber informiert.

In etwa so, wie Stackoverflow das Kommentieren handhabt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X