给定一个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();
}
}
是否可以在提交操作成功或返回错误后继续使用以前方法中的事务?
我的意思是,调用插入函数。它检查事务是否处于活动状态并使用它。如果事务处于非活动状态,则会创建一个事务。对需要事务功能的所有函数进行相同的检查。
如果存在此功能,是否会影响特定功能中的提交/回滚操作?
答案 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代码没有影响。