2011-06-23 91 views
2

我試圖做一個存儲過程的調用從在一個事務中它的簡化形式:DBI begin_work不與存儲過程調用工作

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安裝了亞馬遜的雲實例,發生這種情況的兩者。

如若這項工作還是有辦法解決它?

感謝

回答

1

如果您正在使用自動提交=> 0,那麼你不需要begin_work()。在commit()或rollback()之前,所有東西都在事務中。然後一個新的交易開始。

其實,你應該RAISEERROR => 1連接,因爲你應該得到begin_work()一個錯誤,當AutoCommit爲0。從精細的文檔:

If AutoCommit is already off when begin_work is called then it does nothing except return an error. If the driver does not support transactions then when begin_work attempts to set AutoCommit off the driver will trigger a fatal error.

而且,DBD的是什麼版本::你用的是mysql嗎?我認爲最新版本確實實現了AutoCommit。

+0

正如我所說我取代begin_work語句自動提交=> 0,從來沒有使用過在一起,但是與所存儲的程序工作既不。我正在使用DBD :: mysql 4.019 – LAJ

2

請務必明確finish()每一個執行準備過程CALL之前明確commit()交易。例如,

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

這似乎是我的錯誤,給定的finish()典型的語義。多個結果集,調用more_results等並不重要。

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

+0

所有注意事項:如果您使用Prepared Statements,請不要忘記在提交或回滾之前在PS處理程序上調用 - > finish方法。 – TVNshack