DBI begin_work не работает с вызовами хранимых процедур - PullRequest
2 голосов
/ 23 июня 2011

Я пытаюсь сделать вызов хранимой процедуры из с в транзакции в ее упрощенном виде:

my $dbh= DBI->connect(............  );  

my $sth = $dbh->prepare("call sp_get_workitems (1,1)");
$dbh->begin_work  or die $dbh->errstr;
$sth->execute();
my ($result)= $sth->fetchrow_array();

$dbh->commit;

это дает следующую ошибку:

DBD driver has not implemented the AutoCommit attribute

Если язаменив оператор begin_work на $dbh->{'AutoCommit'} = 0; (до или после подготовки), я получаю эту ошибку:

DBD::mysql::db commit failed: Commands out of sync; you can't run this command now

Если я заменяю вызов хранимой процедуры простым оператором select, все это прекрасно работает.

Хранимая процедура включает в себя ряд обновлений и завершается оператором выбора.Конечно, было бы проще, если бы я мог обработать транзакцию в рамках процедуры, в которой я нуждаюсь для действия некоторого perl-кода, если произойдет откат.

Я использую ActivePerl в Windows 7 и экземпляр облака Amazon с запущенным Centos с установленным DBI 1.616, это происходит на обоих.

Должно ли это работать или есть способ обойти это?

Спасибо

Ответы [ 2 ]

2 голосов
/ 04 апреля 2012

Убедитесь, что вы явно finish() каждая выполненная подготовленная процедура CALL, прежде чем явно commit() транзакции.Например,

$sth->finish;
$sth->commit();

Мне кажется, это ошибка, учитывая типичную семантику finish().Несколько наборов результатов, вызов more_results и т. Д. Не имели значения.

DBD 1.616, DBD :: mysql 4.020 и MySQL 5.5.19.

1 голос
/ 23 июня 2011

Если вы используете AutoCommit => 0, то вам не нужно begin_work (). Все находится в транзакции, пока вы не совершите () или откат (). Затем начинается новая транзакция.

На самом деле, вы должны соединиться с RaiseError => 1, потому что вы должны получить ошибку на begin_work (), когда AutoCommit равен 0. Из точных документов:

Если AutoCommit уже выключен, когда begin_work вызывается, то это делает ничего, кроме возврата ошибки. Если драйвер не поддерживает транзакции затем, когда begin_work пытается установить AutoCommit от водителя сработает фатальная ошибка.

Кроме того, какую версию DBD :: mysql вы используете? Я думаю, что в последней версии реализован AutoCommit.

...