Задавайте вопросы, мы ответим
Вы не зашли.
К сожалению, в хранимках невозможно использовать LOCK TABLES для ускорения длинных последовательностей вставок. А это актуально, например, когда такие вставки идут в цикле. Хотелось бы до цикла заблокировать таблицу....
Вопрос: можно ли применить этот подход, но выполнить LOCK TABLES до вызова процедуры? Скорее всего нет, но хочу быть уверен.
Неактивен
Почему нет? Можно применить.
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;
Неактивен
это хорошо.
А как быть с псевдонимами? сохраняется ли здесь правило что блокировать нужно ВСЕ те псевдонимы таблиц , которые будут использоваться и блокироваться в хранимке?
Неактивен
Что вы называете псевдонимами? Данная область не документирована, но кажется, что запросы, выполняемые внутри процедуры, вызванной после блокировки не отличаются в поведении от запросов, выполняемых напрямую.
Неактивен
вот кусок документации по этому вопросу
(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)
Неактивен
Спасибо, как то раньше не обращал внимание на такую особенность. Есть ли полезное применение такого поведения с алиасами?
Простой тест показывает, что правило на псевдонимы сохраняется внутри процедуры.
Неактивен
Насчет полезности не уверен . Скорее требование к пользователю, т.к. видимо для простоты реализации этого механизма необходимо знать заранее какие дескрипторы таблиц блокировать. В свою очередь, каждое упоминание таблицы в одном запросе требует отдельного дескриптора и блокировки. Единственный механизм адресации одной и той же таблицы под разными именами - псевдонимы. Отсюда и получаем необходимость вынесения всего списка встречающихся псевдонимов в инструкцию LOCK TABLES. Это все ИМХО, конечно
Ладно, будем пробовать, спасибо!
Неактивен
Видимо Вы правы, не получилось выяснить полезность применения. Возможно, это просто особенность реализации.
Неактивен