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