Новости | Документация | Download | Webboard | FAQ | Поиск | Контакты

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 для транзакции. Соответственно вся стройная система летит к чертям...

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


[Это сообщение - спам!]

Последние сообщения из форума

 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
16076




  Copyright Apache.ru © 1999-2017, All Rights Reserved Разработка сайта: Inside.ru  
  РЕКЛАМА НА САЙТЕ: |