代码之家  ›  专栏  ›  技术社区  ›  jeje

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

  •  2
  • jeje  · 技术社区  · 15 年前

    我有几个方法只能在 DBI 驱动程序类当前正在事务中,以确保数据完整性。我想写这样的东西:

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

    从文档中 begin_work ,我知道开始工作会 AutoCommit 在事务期间关闭,并将其设置回“on”on commit或rollback,但我想知道是否测试 自动提交 属性值是实现 isInTransaction .

    谢谢你的帮助。

    J

    3 回复  |  直到 15 年前
        1
  •  7
  •   Ken Fox    15 年前

    如果启用自动提交并使用$dbh启动事务->开始工作,则可以测试是否在事务中:

    if ($dbh->{BegunWork}) {
    

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

    if ($dbh->{ActiveKids}) {
    

    我从来没有检查过是否有一个活动的事务——这让我吃惊,因为没有对它的支持。您可能应该在一个关于DBI的包装器中自己跟踪事务(或者将方法注入DBI)。扩展beginwork以便在禁用autocommit的情况下使用,这看起来像是一个核心DBI修复。

        2
  •  1
  •   brian d foy    15 年前

    如果您正在编写自己的包装类,则可以包装 begin_work 以及其他事务处理方法,这样您就可以保持自己的状态。否则,您将依赖可能发生变化的未记录功能或假设,尤其是当您必须切换到另一个驱动程序时。

        3
  •  0
  •   Dan    15 年前

    您的代码数据库是独立的吗?如果仔细阅读 AutoCommit 因为数据库之间有一些重要的区别,这取决于它们如何处理事务。但是,如果您已经知道数据库以您需要的方式处理事务,那么 自动提交 应该是好的。