powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / не проходит блокировка
12 сообщений из 12, страница 1 из 1
не проходит блокировка
    #32599814
win_pup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Стандартная связка: Apache + PHP 4.3.4 + MySQL 4.0.9-gamma-nt

Одновременно выполняются 2 php-скрипта, перегружаясь каждые 5 сек.
У обоих есть запросы к базе на select.
В одном из них я пишу след.запрос:

mysql_query ("lock tables table1 write, table2 write, table1_2 write");

table1_2 - псевдоним, используемый далее в запросе, но это, наверное, не суть важно...

в этом же скрипте перед строкой:

mysql_query ("unlock tables");

пишу строку:

while (true);

тем самым, заблокировав таблицы, "торможу" скрипт и не "отпускаю" блокировки.

в общем картина получается следующая:

mysql_query ("lock tables table1 write, table2 write, table1_2 write");
...........................
while (true);
mysql_query ("unlock tables");

В экслорере видно, как один из скриптов "подвисает", однако,
в другом экплорере второй скрипт спокойно продолжает рефрешится, читая данные select`ом из заблокированных таблиц.
Разве так должно быть? А может я чего-то не учёл?

Спасибо.
...
Рейтинг: 0 / 0
не проходит блокировка
    #32600237
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу извинюсь, что не совсем по делу. Но
Код: plaintext
1.
while( true);
не хорошая практика. Не стоит ее применять в скриптах, они таки не С/C++ и в чистом виде ассемблерный код не генерят. А там всякие накладки могут быть. Попробуй обойти...
...
Рейтинг: 0 / 0
не проходит блокировка
    #32600737
win_pup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поставил вместо while (true); sleep (60);:

mysql_query ("lock tables table1 write, table2 write, table1_2 write");
...........................
sleep (60);
mysql_query ("unlock tables");

тоже самое: один из скриптов "засыпает" и через 30 секунд прерывается по timeout. Ну это и естественно! Но другие скрипты в эти 30 секунд без проблем продолжают обращаться к базе и читают при этом select`ом инфу из якобы заблокированных таблиц.
Я же, вроде как, их заблокировал?
...
Рейтинг: 0 / 0
не проходит блокировка
    #32600846
sky2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
poprobui zapusti eto rabotaet

file 1.php
Код: plaintext
1.
2.
3.
4.
5.
6.
<?php
    $dbh = mysql_connect('localhost', 'root', '');
    mysql_select_db('test', $dbh);
    mysql_query('lock tables a write, b write', $dbh);
    sleep( 30 );
?>

file 2.php
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<?php
    $dbh = mysql_connect('localhost', 'root', '');
    mysql_select_db('test', $dbh);
    $res = mysql_query("select * from a");
    while ($a = mysql_fetch_row($res))
        print(join(",", $a)."\n");
?>
...
Рейтинг: 0 / 0
не проходит блокировка
    #32601590
win_pup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sky2k, твой пример и на самом деле работает, пока в строку блокировки не добавить:

Код: plaintext
mysql_query ("lock tables a write, b write, c write", $dbh);

где с - псевдоним таблицы b упоминающийся в дальнейшем запросе:

Код: plaintext
mysql_query ("select * from a inner join b on a.a1=b.b1 inner join b c on a.a1=c.c1");

в этом случае 2-му скрипту уже становится абсолютно плевать на блокировку таблиц a и b.
...
Рейтинг: 0 / 0
не проходит блокировка
    #32601900
sky2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ono proishodit ot togo naverno chto tablicy C u tebya netu poetomu stroka
Код: plaintext
1.
mysql_query ("lock tables a write, b write, c write", $dbh);

u tebya zakanchivaetsya oshibkoi zameni na
Код: plaintext
1.
mysql_query ("lock tables a write, b write, c write", $dbh) or exit(mysql_error($dbh));
i prover'

nujno tak i ostavit', budet rabotat' ;)
mysql_query ("lock tables a write, b write", $dbh);


kstati a zachem odnu i tuje tablicu B join 2 raza? eto v tvoem zaprose
select * from a inner join b on a.a1=b.b1 inner join b c on a.a1=c.c1
...
Рейтинг: 0 / 0
не проходит блокировка
    #32601907
sky2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
add


vozmojno ty ohibsya i nado ne, prosto c poluchaetsya psevdonim
select * from a inner join b on a.a1=b.b1 inner join b c on a.a1=c.c1
a
select * from a inner join b on a.a1=b.b1 inner join c on a.a1=c.c1
?
...
Рейтинг: 0 / 0
не проходит блокировка
    #32602879
win_pup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вообще, интересно, конечно, получается...
...дело в том, что он и в самом деле "ругается" на то, что таблицы c не существует! А для того, что бы было боле менее понятно с псевдонимами, попробую перейти к реальным запросам. Вот как он у меня выглядит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	$res = mysql_query ("
		select
			game.id_game,
			game.go,
			game.id_last_user,
			game.last_go,
			user_game_next.next
		from game inner join user_game on game.id_game=user_game.id_game
			inner join user_game user_game_next on game.go=user_game_next.id_user
		where
			game.last_go<2
			and
			(game.sent<>1 or game.sent=1 and unix_timestamp()-game.start_time>game.time*60+10)
			and
			(game.sent=2 or unix_timestamp()-game.start_time>game.time*60)
		group by game.id_game
	");

Даже если не обращать внимание на то, чем напичкан where ... , то всё равно видно, что без псевдонима нам не обойтись. В запросе на блокировку он и в самом деле "ругается" на то, что таблицы user_game_next не существует! Однако, если мы убираем оттуда упоминание этого псевдонима, то он будет ругаться уже в строке самого запроса select. И ругаться будет на то, что таблица user_game_next не была заблокирована! В принципе, это соответствует тому, что пишут в мануале: http://]http://dev.mysql.com/doc/mysql/ru/LOCK_TABLES.html (см. 6-й абзац).
Но, как же тогда быть? Получается 2 варианта: либо я указываю псевдоним, но при этом у меня не проходит lock tables, либо я его оттуда убираю, но тогда в этом случае у меня не будет проходить select.

А может я как-то не правильно пытаюсь блокировать псевдоним user_game_next?
...
Рейтинг: 0 / 0
не проходит блокировка
    #32603195
sky2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select *
from a
inner join b on a.hit=b.hit
inner join b xxx on a.host=xxx.host

etot zapros blockiruetsya pri
lock table a write, b write
a takje i pri
lock table a write
i
lock table b write

eto na ver. 4.0.20
vozmojno u tebya staraya versiya mysql i v novoi eto pomenyali, poprobiu obnovi

a chto ty s rezultatom zaprosa budesh delat'?
...
Рейтинг: 0 / 0
не проходит блокировка
    #32603465
win_pup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sky2k, мне надо блокировать не запрос! Мне надо заблокировать 2 таблицы game и user_game перед тем, как обратится к ним с тем большим запросом, который я указал выше. И, как ты уже видишь, в запросе также учавствует и псевдоним user_game_next. Ну без него никак! Далее, пока один из скриптов (а точнее, как раз ЭТОТ скрипт, который должен блокировать) будет выполнять некоторые действия с таблицами game и user_game в соответствии с тем, каким будет результат большого запроса, другой скрипт (который просто читает инфу из базы) не должен моч читать эти 2 таблицы select`ом.
А если же я напишу так, как ты сказал:

Код: plaintext
mysql_query ("lock tables game write, user_game write");

т.е., без учёта псевдонима user_game_next, то блокировка сработает, но этот вот большой запрос тут же выдаст мне ошибку о том, что таблица user_game_next не была заблокирована командой lock tables.
В принципе, это вполне соответствует тому, что написано в мануале. Но тогда вопрос: как мне заблокировать эти 2 таблицы + 3-ю, как "будущий" псевдоним, (кстати, мне так и не понятно, зачем его вообще блокировать? из другого скрипта я всё равно не смогу к нему обратится), и что бы при этом в строке "lock tables ... " у мня не возникало ошибок?

P.S.: Установил MySQL 4.0.18. Проблема осталась.
...
Рейтинг: 0 / 0
не проходит блокировка
    #32603587
sky2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a nu togda pishi

lock table a write, b write, b as c write
...
Рейтинг: 0 / 0
не проходит блокировка
    #32603685
win_pup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во блин! Дык, ты б сразу так и сказал, что ТАК писать надо! :-)
Так ведь оно сразу и заработало!

sky2k, огромное Спасибо тебе за помощь ;-)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / не проходит блокировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]