活动交易和PHP

Jas*_*son 1 php transactions yii

给定一个PHP类具有几种函数的样式

public function $op_Data() {
    $command = Yii::app()->db->createCommand("");
    $transaction = Yii::app->db->beginTransaction();

    try {
      //code here
      $transaction->commit()
    } catch (Exception $e) {
      $transaction->rollback();
      return "Operation Failed\n" . $e->getTraceAsString();
    }
}
Run Code Online (Sandbox Code Playgroud)

在提交操作成功或返回错误后,是否可以继续使用先前方法中的事务?

我的意思是,调用插入函数.它检查事务是否处于活动状态并使用它.如果事务处于非活动状态,则会创建一个事务.对需要事务功能的所有函数进行相同的检查.

如果存在此功能,它是否会影响特定功能中的提交/回滚操作?

Ezz*_*zze 8

如果要在单个事务中执行放置在单独方法中的SQL查询,可以像这样包装它们:

$transaction = Yii::app()->db->beginTransaction();
try {
    $instance->insertMethod();
    $instance->updateMethod();
    $instance->deleteMethod();
    // ...more DB methods calls
    $transaction->commit();
}
catch (Exception $e) {
    $transaction->rollback();
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,您必须检查方法是否已在外部创建事务.它可以使用CDbConnection's getCurrentTransaction()方法完成,如下所示:

public function $op_Data() {
    $command = Yii::app()->db->createCommand("");
    $transaction = Yii::app()->db->getCurrentTransaction();
    if ($transaction !== null) {
        // Transaction already started outside
        $transaction = null;
    }
    else {
        // There is no outer transaction, creating a local one
        $transaction = Yii::app()->db->beginTransaction();
    }

    try {
      //code here
      if ($transaction !== null)
          $transaction->commit()
    } catch (Exception $e) {
      if ($transaction !== null)
          $transaction->rollback();
      return "Operation Failed\n" . $e->getTraceAsString();
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果保留现有PHP类的代码是首选方法,您还可以查看覆盖PHP PDO类的默认实现的机会.这种嵌套事务实现是可能解决方案的框架.主要思想是在第一次调用时启动唯一的事务,beginTransaction()并在第N次调用时真正结束事务,commit()或者rollback()其中N - 是一个后续beginTransaction()调用的计数.