如何测试DBI驱动程序状态是否在事务中?

jej*_*eje 2 perl transactions dbi

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

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

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

谢谢你的帮助.

J.

Ken*_*Fox 7

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

if ($dbh->{BegunWork}) {
Run Code Online (Sandbox Code Playgroud)

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

if ($dbh->{ActiveKids}) {
Run Code Online (Sandbox Code Playgroud)

我从来没有检查过是否有交易活动 - 令我惊讶的是它没有支持它.您应该在一个关于DBI的包装器中自己跟踪事务(或者将方法注入到DBI中).扩展BegunWork以便在禁用AutoCommit时非常有用,看起来像核心DBI修复.