Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Nieoczekiwane działanie polecenia LOCK TABLES
Mion
post 29.12.2009, 11:39:20
Post #1





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


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....

Ten post edytował Mion 29.12.2009, 11:49:48
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
webdice
post 29.12.2009, 11:47:43
Post #2


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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.

Go to the top of the page
+Quote Post
Mion
post 29.12.2009, 12:14:04
Post #3





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował Mion 29.12.2009, 14:10:53
Go to the top of the page
+Quote Post
Mchl
post 29.12.2009, 16:34:43
Post #4





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Jesteś pewien, że te dane nie idą z jakiegoś cache?
Go to the top of the page
+Quote Post
Mion
post 29.12.2009, 16:44:42
Post #5





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


Tak
Go to the top of the page
+Quote Post
Mchl
post 29.12.2009, 17:02:08
Post #6





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Jaka to wersja serwera?
Nie chciałbym być sztampowy, ale "u mnie działa".
Go to the top of the page
+Quote Post
Mion
post 29.12.2009, 17:12:15
Post #7





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mchl
post 29.12.2009, 17:22:09
Post #8





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Mion
post 29.12.2009, 17:48:09
Post #9





Grupa: Zarejestrowani
Postów: 105
Pomógł: 6
Dołączył: 7.03.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował Mion 29.12.2009, 18:41:37
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 23:09