Apache.RU - Webboard
Вернуться
Lock tables и вложенные транзакции (Helpix) 14/07 - 16:49:11
Re: Lock tables и вложенные транзакции (Dinky) 14/07 - 18:07:59
> Original message text:
> From:
> Helpix - 14/07 - 16:49:11
> Subject:Lock tables и вложенные транзакции
> -----------------
> Прошу помощи клуба и уважаемых магистров.
>
> MySQL, таблицы - BDB, Perl.
> Делаю вложенные транзакции:
>
> 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 для транзакции. Соответственно вся стройная система летит к чертям...
>
> Есть ли мысли, как это дело можно обойти?
>
From:
Dinky - 14/07 - 18:07:59
Subject:Lock tables и вложенные транзакции
-----------------
перечитал два раза, все равно не въехал, значит не гожусь пока в магистры :)
зачем надо блокировать таблицы? и как их надо блокировать?
и вообще, как-то дико звучит - табличные блокировки и транзакции :) А на InnoDB сложно перебраться? это, кстати, настоятельно рекомендуется MySQL AB ;)
>Есть ли мысли, как это дело можно обойти?
InnoDB!
--
Dmitry
[Это сообщение - спам!]
Последние сообщения из форума
16076
|
|