用Apache :: DBI和firebird编程。在异常

时间:2017-03-23 16:29:44

标签: perl firebird mod-perl

我在使用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?

感谢。

泰远,

0 个答案:

没有答案