1

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

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

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

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

4

2 回答 2

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

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

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 类的代码是首选方法,您还可以考虑覆盖 PHPPDO类的默认实现的机会。这种嵌套事务实现是可能的解决方案的框架。主要思想是在第一次调用 of 时开始唯一的事务,并在第 N 次调用or时beginTransaction()真正结束事务,其中 N - 是顺序调用的计数。commit()rollback()beginTransaction()

于 2013-06-17T16:01:00.800 回答
1

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

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

于 2013-06-17T15:44:51.267 回答