我有几个方法只有在我的DBI驱动程序类当前进入事务以确保数据完整性的情况下才能执行。我想写这样的东西:
sub m{
my ($self , $dbh ) = @_ ;
unless( $dbh->isInTransaction()){
die "Use this only within a transaction\n" ;
}
etc ...
}
从begin_work的文档中,我了解到begin_work会在事务处理期间将AutoCommit
设置为关闭,并在提交或回滚时将其设置为“on”,但我想知道是否测试AutoCommit
属性值是实现isInTransaction
的安全方法。
感谢您的帮助。
学家
答案 0 :(得分:7)
如果启用AutoCommit并使用$ dbh-> begin_work启动交易,您可以测试是否在交易中:
if ($dbh->{BegunWork}) {
如果禁用AutoCommit,DBI没有多大帮助:您只能检查连接到数据库句柄的活动语句:
if ($dbh->{ActiveKids}) {
我从来没有检查过是否有交易活动 - 令我惊讶的是它没有支持它。您应该在一个关于DBI的包装器中自己跟踪事务(或者将方法注入到DBI中)。在禁用AutoCommit的情况下扩展BegunWork非常有用,看起来像核心DBI修复。
答案 1 :(得分:1)
如果您正在编写自己的包装器类,则可以包装begin_work
和其他事务方法,以便您可以维护自己的状态。否则,您将依赖可能发生变化的无证功能或假设,尤其是在您必须切换到其他驱动程序时。
答案 2 :(得分:0)
您的代码是否与数据库无关?如果仔细阅读AutoCommit
部分,因为数据库之间存在一些重要差异,具体取决于它们处理事务的方式。但是,如果您已经知道您的数据库以您需要的方式处理交易,那么AutoCommit
应该没问题。