2

我正在尝试以简化形式从事务中调用存储过程:

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 语句替换存储过程调用,它一切正常。

存储过程包括许多更新,并以一个 select 语句结束。当然,如果我可以在过程中处理事务会更容易,如果发生回滚,我需要执行一些 perl 代码。

我在 Windows 7 上使用 ActivePerl 和一个运行 Centos 并安装了 DBI 1.616 的亚马逊云实例,这两种情况都会发生。

这应该工作还是有办法解决它?

谢谢

4

2 回答 2

2

确保在显式事务finish()之前显式执行每个准备好的过程 CALL 。commit()例如,

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

考虑到finish(). 多个结果集、调用more_results等无关紧要。

DBD 1.616、DBD::mysql 4.020 和 MySQL 5.5.19。

于 2012-04-03T21:15:52.897 回答
1

如果您正在使用AutoCommit => 0,那么您不需要begin_work(). 一切都在交易中,直到您commit()rollback(). 然后开始新的交易。

实际上,您应该与 连接,因为您应该在何时为 0 时RaiseError => 1收到错误消息。来自精美的文档:begin_work()AutoCommit

如果在调用 begin_work 时 AutoCommit 已经关闭,那么它除了返回错误之外什么都不做。如果驱动程序不支持事务,那么当 begin_work 尝试将 AutoCommit 设置为关闭时,驱动程序将触发致命错误。

另外,你用的是什么版本的DBD::mysql?我认为最新版本确实实现了AutoCommit.

于 2011-06-23T16:47:40.437 回答