我在使用Firebird进行Web应用程序编程时遇到了问题。
我在Firebird中使用mod_perl和Apache :: DBI。
并且还使用CGI::Session
进行会话处理。
CGI::Session
使用已连接的$dbh
与Firebird。
AutoCommit已开启。
每个(多个)sql执行都由eval {}
语句包装。
例如,
$dbh = DBI->connect("dbi:Firebird:db=$DBSERVER:/home/cdbs/xxnet.fdb;
ib_charset=UTF8;ib_dialect=3",$DBUSER,$DBPASS,{
AutoCommit=>1,
LongReadLen=>8192,
RaiseError=>1
});
eval { $dbh->begin_work()
my $sql = "SELECT * FROM SAMPLETABLE"
my $st = $dbh->prepare($sql);
$st->execute();
while (my $R = $st->fetchrow_hashref()) {
...
}
$st->finish();
}; warn $@ if $@;
if ($@) {
$dbh->rollback();
}else{
$dbh->commit();
}
当在eval部分引发异常时,执行warn语句并尝试回滚事务。
错误消息记录在error_log中,之后,$dbh
将被卡住 - CGI :: Session不返回任何数据。
我以为'警告'声明包含'回滚',所以我试着评论$dbh->rollback()
声明。它看起来不错。
其他方式,我使用'警告'记录调试消息 - 如print STDERR $@
。
httpd会像上面那样陷入困境。
使用Oracle(DBD :: Oracle),我没有看到这些情况。
请告诉我哪个部分与火鸟使用交易是坏的? 警告? DBD :: Firebird?
感谢。
泰远,