活动交易和PHP

时间:2013-06-17 15:36:59

标签: php yii transactions

给定一个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();
    }
}

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

但是,在这种情况下,您必须检查您的方法是否已在外部创建了事务。可以使用CDbConnection的{​​{3}})方法完成,如下所示:

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();
    }
}

<强>更新

如果保留现有PHP类的代码是首选方法,您还可以查看覆盖PHP PDO类的默认实现的机会。 getCurrentTransaction(是可能解决方案的骨架。主要想法是在beginTransaction()的第一次调用时启动唯一的交易,并在commit()rollback()的第N次调用中真正结束交易,其中N - 是序数{{1调用。

答案 1 :(得分:1)

它高度依赖于您的数据库引擎,但通常一旦事务被回滚或提交,您将不得不“创建”一个新的。

事务是数据库引擎中的“保存点”,应该对您的php代码没有影响。