2009-01-14 12 views
5

Mam kilka problemów, gdy ludzie próbują uzyskać dostęp do bazy danych MySQL i próbują zaktualizować tabele z tymi samymi informacjami.Blokowanie bazy danych MySQL, aby tylko jedna osoba mogła uruchomić zapytanie?

Mam stronę napisaną przy użyciu PHP. Na tej stronie znajduje się zapytanie sprawdzające, czy określone dane zostały wprowadzone do bazy danych. Jeśli dane nie są, to kontynuuję wstawianie. Problem polega na tym, że jeśli dwie osoby spróbują w tym samym czasie, kontrola może powiedzieć, że dane nie zostały jeszcze wprowadzone, ale kiedy wstawianie odbywa się przez drugą osobę.

Jaki jest najlepszy sposób na obsłużenie tego scenariusza? Czy mogę zablokować bazę danych, aby najpierw przetwarzać tylko moje zapytania, a potem inne?

Odpowiedz

1

Szukasz LOCK.

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

ten może być prowadzony za pomocą prostego mysql_query (lub MySQLi::query/prepare).

Powiedziałbym, że lepiej jest zablokować określone tabele (chociaż prawdopodobnie można spróbować LOCK TABLES *), które należy zablokować, a nie całą bazę danych - ponieważ nic nie będzie w stanie odczytać. Myślę, że szukasz czegoś podobnego:

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

Albo w PHP:

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

Można sprawdzić, czy dane zostały zmienione, zanim coś zmieniać. W takim przypadku, jeśli ktoś edytował dane podczas gdy inna osoba robi swoją edycję, zostanie o tym poinformowany.

Trochę jak stackoverflow obsługuje komentowanie.

5

Przeczytaj na database transactions. Prawdopodobnie jest to lepszy sposób radzenia sobie z tym, czego potrzebujesz niż prowadzenie LOCK TABLES.

3

Stoły blokujące ręcznie to najgorsze, co można zrobić. Co się stanie, jeśli kod do ich odblokowania nigdy się nie uruchomi (ponieważ PHP się nie powiedzie lub użytkownik kliknie następny krok, odejdzie od komputera, itp.).

Jednym ze sposobów na zminimalizowanie tego w aplikacji internetowej, a często popełnianym błędem jest posiadanie datagridu pełnego pól tekstowych danych do edycji, z przyciskiem zapisu w rzędzie lub na całej tabeli. Oczywiście, jeśli dana osoba otworzy to w piątek i wróci w poniedziałek, dane mogą być błędne i mogą oszczędzać na nowych danych. Jednym prostym sposobem na naprawienie tego jest posiadanie przycisków EDIT w każdym rzędzie, a kliknięcie przycisku powoduje załadowanie formularza edycji, w ten sposób mają nadzieję, że ładują nowe dane i mogą przesłać tylko 1 zmianę wiersza na raz.

Co ważniejsze, należy uwzględnić pole datetime jako ukryte pole wprowadzania danych, a gdy próbują przesłać dane, należy spojrzeć na datę i zdecydować, ile mają dane i podjąć decyzję, ile lat jest za starych i ostrzec lub odrzucić użytkownika o ich działaniu.