如果你想在单个事务中执行放置在不同方法中的 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()