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

时间:2011-06-23 13:28:08

标签: 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;

这会出现以下错误:

DBD driver has not implemented the AutoCommit attribute

如果我用$dbh->{'AutoCommit'} = 0;替换begin_work语句(在准备之前或之后),我会收到此错误:

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的亚马逊云实例,这两种情况都会发生。

这应该有效还是有办法解决?

由于

2 个答案:

答案 0 :(得分:2)

在明确finish()事务之前,请确保明确commit()每个已执行的准备过程CALL。如,

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

考虑到finish()的典型语义,这对我来说似乎是个错误。调用more_results等多个结果集并不重要。

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

答案 1 :(得分:1)

如果您使用的是AutoCommit => 0,那么你不需要begin_work()。在commit()或rollback()之前,一切都在事务中。然后开始新的交易。

实际上,你应该连接RaiseError => 1,因为当AutoCommit为0时,你应该在begin_work()上出错。来自精美的文档:

  

如果AutoCommit已经关闭了   然后调用begin_work然后调用它   什么,除了返回错误。如果   驱动程序不支持事务   然后当begin_work尝试设置时   关闭驱动程序的AutoCommit将触发   一个致命的错误。

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