Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nieoczekiwane działanie polecenia LOCK TABLES
Forum PHP.pl > Forum > Bazy danych
Mion
Witam ponownie,
w konsoli wydaje polecenie:
  1. mysql> LOCK TABLES UserZdjecia AS U WRITE;
Które powinno zablokować tabelę dla innych wątków zarówno odczytu jak i zapisu lub modyfikacji i zaraz potem przeładowuję stron www zawiera zapytanie SQL które wybiera dane
  1. SELECT U.idz, U.id_usera, U.zdjecie_nazwa FROM UserZdjecia U LIMIT 10;
i dane te są wybierane.

Wiec jakie jest w sumie działanie tej komendy LOCK TABLES skoro można dane odczytać w innym wątku?questionmark.gif

Tabela jest typu InnoDB....
webdice
Blokujesz tabele przed zapisem.

  1. LOCK TABLES
  2. tbl_name [[AS] alias] lock_type
  3. [, tbl_name [[AS] alias] lock_type] ...
  4.  
  5. lock_type:
  6. READ [LOCAL]
  7. | [LOW_PRIORITY] WRITE
  8.  
  9. UNLOCK TABLES


Zwróć uwagę na lock_type. Zresztą poczytaj sobie manual, tam wszystko jest napisane.

Mion
WRITE blokuje tabele przed "Przy klauzuli WRITE jedynie aktualny wątek będzie dopuszczony do jakichkolwiek operacji na tabeli (zarówno odczytu jak i zapisu lub modyfikacji). " W tym wypadku wywołanie ze strony www powinno uruchomić inny wątek niż wątek uruchomiony z konsoli gdzie wydałem komendę...
////
Nawet jak zablokuje wszystkie tabele z konsoli wchodzące w skład zapytania

  1. mysql> LOCK TABLES UserZdjecia AS U WRITE, UserKonto AS UK WRITE;
  2. Query OK, 0 rows affected (0,00 sec)
lub
  1. mysql> LOCK TABLES UserZdjecia AS U READ, UserKonto AS UK READ;
  2. Query OK, 0 rows affected (0,00 sec)

Mogę wygenerować stronę która wykonuje SELECT dla tych tabel. Jedynie zgodnie z oczekiwaniem działa kiedy wywołuje się komenda UPDATE dla zablokowanych tabeli - wtedy strona "czeka" na odblokowanie tabel.

Jest to dosyć nieoczekiwane działanie [właściwie nie działanie] tego polecenia, a co gorsza wydaje mi się, że komendy są właściwe sad.gif
Mchl
Jesteś pewien, że te dane nie idą z jakiegoś cache?
Mion
Tak
Mchl
Jaka to wersja serwera?
Nie chciałbym być sztampowy, ale "u mnie działa".
Mion
No właśnie, bo powinno dziać, ale nie działa, jedynie działa w wypadku poleceń zmieniających jak update sad.gif
Wersja serwera: 5.0.67
Mchl
Nie znalazłem żadnego zgłoszenia błędu dotyczącego LOCK TABLES w tej wersji.

Próbowałeś otworzyć sobie dwie konsole, w jednej zablokować tabele, a z drugiej zrobić SELECTa?
Mion
Z dwoma klientami konsolowymi nie sprawdzałem, ale sprawdzałem blokując w konsoli poleceniem:
LOCK TABLES UserZdjecia AS U WRITE, UserKonto AS UK WRITE;
a tabele wywoływałem SELECT z poziomu przeglądarki www oraz programu MySQL QueryBrowset czyli z innych wątków i blokada działa tylko dla update, ale nie na select pomimo jej założenie w/w instrukcją SQL beeeee sad.gif

/// Po dłuższej walce z tym problemem

Już wiem dlaczego tak dziwnie się działo, bo jednak ostatnie polecenia select było cachowane co zauważyłem wywolujac inną stronę z select na której już nie działało. Jeśli nie ma pobierać rekordów z'cachowanych przy włączonej blokadzie należy do klauzuli SELECT dodać SQL_NO_CACHE winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.