Mysql DBI begin_work不适用于存储过程调用

Mysql DBI begin_work不适用于存储过程调用,mysql,perl,stored-procedures,dbi,autocommit,Mysql,Perl,Stored Procedures,Dbi,Autocommit,我试图以简化形式从事务中的调用存储过程: 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;

我试图以简化形式从事务中的调用存储过程:

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
如果我用$dbh->{'AutoCommit'}=0替换begin_工作语句;在prepare之前或之后,我得到以下错误:

DBD::mysql::db commit failed: Commands out of sync; you can't run this command now
如果我用一个简单的select语句替换存储过程调用,则一切正常

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

我在Windows7上使用ActivePerl,在安装了DBI1.616的Centos上运行amazon云实例,这两种情况都会发生

这是可行的还是有办法解决


谢谢

如果您使用的是自动提交=>0,则无需开始工作。在提交或回滚之前,所有内容都在事务中。然后一个新的事务开始

实际上,您应该使用RaiseError=>1进行连接,因为当AutoCommit为0时,您应该在开始工作时出错。从罚款文件:

如果自动提交在 开始工作叫做开始工作 除了返回一个错误外,什么都没有。如果 驱动程序不支持事务 然后,当开始工作时,尝试设置 自动提交关闭将触发驱动程序 致命的错误

另外,您使用的是什么版本的DBD::mysql?我认为最新版本确实实现了自动提交。

确保在显式提交事务之前显式完成每个已执行的准备过程调用。例如:

$sth->finish;
$sth->commit();
考虑到finish的典型语义,这对我来说似乎是一个bug。多个结果集、调用更多结果等都无关紧要


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

正如我所说,我用autoCommit=>0替换了begin_work语句,从未将它们一起使用,但是它们都不能用于存储过程。我使用的是DBD::mysql 4.019注意:如果您使用的是预处理语句,请不要忘记在提交或回滚之前调用PS处理程序上的->finish方法。