SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.02.2011 14:31:59

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Блокировки и транзакции

Приветствую всех.
Есть таблица InnoDB. Делаю специально обученного бота который должен каждую минуту копировать всю информацию из таблицы и после очищать ее, меня беспокоит, что будет если во время этой операции мы пошлем команду на запись в таблицу? Выборка и удаление должны выполняться друг за другом, в это время записывать нельзя, можно как-то это сделать?
p.s. мне достаточно последовательности операторов, а дальше я сам разберусь

Неактивен

 

#2 16.02.2011 15:18:51

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Блокировки и транзакции

Сделайте в начале бота блокировку таблицы

LOCK TABLES tbl1,tbl2 WRITE;


А после работы бота UNLOCK TABLES;

Неактивен

 

#3 16.02.2011 15:30:50

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Блокировки и транзакции

Классно, то что нужно, а транзакции я уже сам надыбал. Спасибо!

Неактивен

 

#4 17.02.2011 10:12:27

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Блокировки и транзакции

У меня еще один вопрос, что будет если при такой транзакции:

BEGIN
INSERT...
DELETE...
UPDATE...
SELECT...
COMMIT

в другом потоке вызывается LOCK TABLES, транзакция вызывается средствами php, блокировка вызывается сторонней программой.
Как поведет себя MySQL, будет ли php ждать или выдаст ошибку?

Неактивен

 

#5 17.02.2011 13:25:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Блокировки и транзакции

Тип клиента совершенно не важен - PHP, С или другой коннектор.

Вы не уточнили в какой момент вызван LOCK TABLES. Если транзакция уже начата, он будет ждать ее завершения до блокировки. Если наоборот, то транзакция будет ждать на первом запросе, обращающемся к заблокированной таблице.

Все это вы можете легко проверить подключившись двумя клиентами к MySQL и выполняя указанные вами команды.

Неактивен

 

#6 17.02.2011 13:48:39

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Блокировки и транзакции

Совершенно верно, спасибо за ответ.

Неактивен

 

#7 17.02.2011 16:06:15

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Блокировки и транзакции

Кстати синтаксис у вас не правильный smile
Надо так: LOCK TABLES orders WRITE, allorders WRITE

Неактивен

 

#8 24.02.2011 11:17:10

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Блокировки и транзакции

Что будет делать mysql в случае если специальный бот посылает команды:

LOCK TABLES orders WRITE, allorders WRITE
INSERT...
UPDATE...

и после этого бот теряет связь с сервером на неопределенное время не успев разблокировать таблицы, а другие пользователи mysql продолжают работать и ждут разблокировки, будет ли mysql держать очередь в течении определенного времени или произойдет что-то другое?

Отредактированно septera (24.02.2011 11:27:00)

Неактивен

 

#9 25.02.2011 00:10:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Блокировки и транзакции

Если серверу при этом приедет пакет об обрыве соединения, то блокировки
пропадут сразу же. В противном случае — поток будет ждать wait_timeout
секунд и будет уничтожен после этого принудительно.

wait_timeout можно выставлять не только глобально, но и прямо для текущего
соединения: SET wait_timeout = 10. Учтите, что тогда через 10 секунд простоя,
соединение оборвется.

Неактивен

 

#10 25.02.2011 09:44:14

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Блокировки и транзакции

Спасибо, за как всегда полезную информацию.

Еще один небольшой вопрос.
Если мы вызываем BEGIN потом в течении 30 секунд будут INSERT и UPDATE потом COMMIT, то перед вызовом COMMIT остальные пользователи выбирая данные из задействованных таблиц будут ли видеть внесенные изменения или все изменения сначала записываются в журнал и не видны никому и только после COMMIT разом записываются в таблицы?

Неактивен

 

#11 25.02.2011 11:12:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Блокировки и транзакции

Это зависит от уровня изоляции читающих транзакций. По умолчанию исполь-
зуется REPEATABLE-READ (видят только примененные транзакции, завершенные
после начала текущей).

Неактивен

 

#12 25.02.2011 11:42:16

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Блокировки и транзакции

Спасибо, вот теперь все smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson