Apache.RU - Webboard
Вернуться
Lock tables и вложенные транзакции (Helpix) 14/07 - 16:49:11
Re: Lock tables и вложенные транзакции (Dinky) 14/07 - 18:07:59
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 для транзакции. Соответственно вся стройная система летит к чертям...
Есть ли мысли, как это дело можно обойти?
[Это сообщение - спам!]
Последние сообщения из форума
16076
|
|