使用具有多个类的静态transactionCounter管理事务的正确方法是什么?

时间:2016-09-25 02:12:41

标签: php mysql database pdo insert

我对使用http://php.net/manual/en/pdo.begintransaction.php

中描述的数据库类感兴趣

但是该类有一个问题,它使用的是非$transactionCount属性,这意味着如果我有多个类开始事务,它将导致多次提交并使我的代码最终出错,看看这个示例(不可运行,只是为了理解):

class Field extends Database {
    public function createFieldToForm( $fieldName, $formId )
    {
         // static transactionCount = 0
         // transactionCount = 0
         $this->beginTransaction();   
//           .... createFieldToForm code ....
         $last_id_new_fieldName = $this->insert( $fieldName );
         $formFields = new FormFields();
         $formFields->assignFieldToForm( $last_id_new_fieldName, $formId );
         $this->commit();
    }

    public function insert( $fieldName )
    {
         try {
              // static transactionCount = 1
              // transactionCount = 1
              $this->beginTransaction();
              $dbh = Database::getDatabaseConnection();
              $dbh->prepare( "INSERT INTO form(fieldname) VALUES (:fieldname)" );
            //   ... bind ...
              $dbh->execute();
              $this->commit();
              return $dbh->lastInsertId();
         }
         catch (PDOException $e) {
             $this->rollback();
         }
    }
}

class FormFields extends Database {
    public function assignFieldToForm( $idFieldName, $formId )
    {
       // static transactionCount = 1
              // transactionCount = 0
       $this->beginTransaction();
//              ...  assign the created field to the form ....
       $this->insert( $idFieldName, $formId );
       $this->commit();
    }

    public function insert( $idFieldName, $formId )
    {
         try {
 // static transactionCount = 2
              // transactionCount = 1
              $this->beginTransaction();
              $dbh = Database::getDatabaseConnection();
              $dbh->prepare( "INSERT INTO form_fields(idfield,formid) VALUES (:idfield,:formid)" );
            //   ... bind ...
              $dbh->execute();
              $this->commit();
         }
         catch (PDOException $e) {
             $this->rollback();
         }
    }
}

const FORM_USER_INFORMATION = 3;
$fieldPhone = new Field();
$fieldPhone->createFieldToForm( "phone_number", FORM_USER_INFORMATION  );

正如您在此代码的注释中所看到的,如果$transactionCount的值是静态的,则createFieldToForm的值非常不同,但此问题的主要内容是关于静态属性,如果它的值可能是可以在执行(例如)trait Foo[A, B] { // implementation details not important } 期间由另一个代码线程/函数或外部调用更改。你可以向我推荐什么呢?

1 个答案:

答案 0 :(得分:2)

此类不是来自PHP手册,而是来自 comments 到手册页。这使得故意不可靠的来源。

要解决您的问题,只需摆脱所有这些"交易"。因为仅对单个查询使用事务是没有意义的。

因此,你很可能根本不需要交易,也不需要柜台,也不需要这个类。