3

我有几个方法应该只在我的DBI驱动程序类当前进入事务以确保数据完整性的情况下执行。我正在寻找这样的东西:

sub m{
  my ($self , $dbh ) = @_ ;
  unless( $dbh->isInTransaction()){
     die "Use this only within a transaction\n" ;
  }
  etc ...
}

begin_work的文档中,我了解到 begin_work 将AutoCommit在事务期间设置为关闭,并在提交或回滚时将其设置回“开启”,但我想知道测试AutoCommit属性值是否是一种安全的实现方式isInTransaction

谢谢你的帮助。

J。

4

3 回答 3

8

如果启用 AutoCommit 并使用 $dbh->begin_work 启动事务,则可以测试以查看是否处于事务中:

if ($dbh->{BegunWork}) {

如果禁用 AutoCommit,DBI 并没有多大帮助:您只能检查连接到数据库句柄的活动语句:

if ($dbh->{ActiveKids}) {

我从来不需要检查是否有交易活动——令我惊讶的是,没有支持它。您可能应该在有关 DBI 的包装器中自己跟踪事务(或将方法注入 DBI)。在禁用 AutoCommit 的情况下扩展 BegunWork 看起来像是一个核心 DBI 修复。

于 2009-12-30T17:13:45.720 回答
2

如果您正在编写自己的包装类,则可以包装begin_work和其他事务方法,以便您可以维护自己的状态。否则,您将依赖可能更改的未记录功能或假设,尤其是在您必须切换到另一个驱动程序时。

于 2010-01-01T19:57:31.303 回答
0

你的代码是独立于数据库的吗?如果如此仔细阅读部分,AutoCommit因为数据库之间存在一些重要差异,具体取决于它们如何处理事务。但是,如果您已经知道您的数据库以您需要的方式处理事务,那么AutoCommit应该没问题。

于 2009-12-30T16:01:03.323 回答