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

MySQL, таблицы - BDB, Perl.
Делаю вложенные транзакции:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
sub update1 ( $ )
{
   my $self = shift;

   TransBegin ();

   eval {
     $pdb->do( "UPDATE table1 SET..." );
     $pdb->do( "UPDATE table2 SET..." );
     $self->update2();
   };
   
   my $sErr = TransEnd ( $@ );

   if ( $sErr ) {
     die "$sErr";
   }
}

Функция TransBegin увеличивает счетчик вложенности транзакций, TransEnd - уменьшает и если он достигает нуля - делает commin. А при необходимости - делает rollback.

Функция update2 аналогична update1 и также содержит TransBegin и TransEnd. Всё работает, всё отлично и красиво.

Вспоминаю про необходимость блокировки таблиц. И тут выясняется пренеприятнейшая вещь. В общем случае, во внешней транзакции я не обязан знать, какие именно таблицы вглуби мне необходимо блокировать. Соответственно хочется блокировать их по мере необходимости. Т.е: В функции update1 я знаю, что мне понадобится заблокировать table1 и table2. А в update2 я знаю, что необходимо блокировать table3 и table4. При этом в update1 про table3 и table4 мне ничего не известно. Поэтому первое, что мне пришло в голову сделать - это передавать список блокируемых таблиц в TransBegin. А в этой функции каждый раз вызывать lock tables. Т.е. в update1 вызывается TransBegin, которая блокирует table1 и table2. В update2 к ним добавляются table3 и table4 и вызывается lock tables на все четыре таблицы. Как бы взамен предыдущего, который был только на две таблицы.

И вот тут я радостно выясняю, что, оказывается, lock tables насильно вызывает commit для транзакции. Соответственно вся стройная система летит к чертям...

Есть ли мысли, как это дело можно обойти?

--
Георгий (Юра) Киселев
http://www.helpix.ru
...
Рейтинг: 0 / 0
Lock tables и вложенные транзакции
    #32603976
Marat_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем блокировать?
UPDATE сам заблокирует что ему надо.
У Вас ведь InnoDB?

Кстати мы тоже сочиняем вложенные транзакции

Жизнь коротка - потерпи немного :)
...
Рейтинг: 0 / 0
Lock tables и вложенные транзакции
    #32603985
qazwsxedc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BDB у него таблицы
...
Рейтинг: 0 / 0
Lock tables и вложенные транзакции
    #32605071
Marat_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИВИ по-моему хуже чем InnoDB, но и там блокировки автоматически ставятся до конца транзакции. Правда уже не построчно.

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


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