SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 04.06.2008 00:04:47

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

блокировки и хранимые процедуры

К сожалению, в хранимках невозможно использовать LOCK TABLES для ускорения длинных последовательностей вставок. А это актуально, например, когда такие вставки идут в цикле. Хотелось бы до цикла заблокировать таблицу....
Вопрос: можно ли применить этот подход, но выполнить LOCK TABLES до вызова процедуры? Скорее всего нет, но хочу быть уверен.

Неактивен

 

#2 04.06.2008 01:03:28

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

Re: блокировки и хранимые процедуры

Почему нет? Можно применить.

mysql> CREATE TABLE bg (id int);
mysql> CREATE PROCEDURE bg_ins() INSERT INTO bg VALUES(floor(1000*rand()));
mysql> LOCK TABLE bg WRITE;
mysql> call bg_ins();
Query OK, 1 row affected (0.00 sec)
mysql> call bg_ins();
Query OK, 1 row affected (0.00 sec)
mysql> call bg_ins();
Query OK, 1 row affected (0.00 sec)
mysql> UNLOCK TABLES;

Неактивен

 

#3 04.06.2008 19:14:10

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

Re: блокировки и хранимые процедуры

это хорошо.
А как быть с псевдонимами? сохраняется ли здесь правило что блокировать нужно ВСЕ те  псевдонимы таблиц , которые будут использоваться и блокироваться в хранимке?

Неактивен

 

#4 04.06.2008 19:16:44

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

Re: блокировки и хранимые процедуры

Что вы называете псевдонимами? Данная область не документирована, но кажется, что запросы, выполняемые внутри процедуры, вызванной после блокировки не отличаются в поведении от запросов, выполняемых напрямую.

Неактивен

 

#5 04.06.2008 23:12:37

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

Re: блокировки и хранимые процедуры

вот кусок документации по этому вопросу
(http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html):

You cannot refer to a locked table multiple times in a single query using the same name. Use aliases instead, and obtain a separate lock for the table and each alias:

mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;

и ниже по тексту

Отредактированно shutdown (04.06.2008 23:17:03)

Неактивен

 

#6 05.06.2008 01:15:08

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

Re: блокировки и хранимые процедуры

Спасибо, как то раньше не обращал внимание на такую особенность. Есть ли полезное применение такого поведения с алиасами?

Простой тест показывает, что правило на псевдонимы сохраняется внутри процедуры.

Неактивен

 

#7 05.06.2008 09:31:55

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

Re: блокировки и хранимые процедуры

Насчет полезности не уверен smile. Скорее требование к пользователю, т.к. видимо для простоты реализации этого механизма необходимо знать заранее какие дескрипторы таблиц блокировать. В свою очередь, каждое упоминание таблицы в одном запросе требует отдельного дескриптора и блокировки. Единственный механизм адресации одной и той же таблицы под разными именами - псевдонимы. Отсюда и получаем необходимость вынесения всего списка встречающихся псевдонимов в инструкцию LOCK TABLES. Это все ИМХО, конечно smile
Ладно, будем пробовать, спасибо!

Неактивен

 

#8 15.06.2008 01:20:57

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

Re: блокировки и хранимые процедуры

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

Неактивен

 

Board footer

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