在某段代码中,当某个update或者insert操作数据库出错的情况下。此段代码中全部update和insert数据库操作取消。
在某段代码中,当某个update或者insert操作数据库出错的情况下。此段代码中全部update和insert数据库操作取消。
Yii::app()->db->beginTransction();
我尝试了,没成功。
$transaction=Yii::app()->db->beginTransaction();
try{
$model1->save();
$model2->save();
$model3->save();
$model4->save();
$model5->save();
出错
$model6->save();
$transaction->commit();
}
catch(Exception $e){
$transaction->rollBack();
}
model1 , model2 , model3 , model4 , model5 照样存储成功!
可能和你的数据库有关。这些save()在最底层还是用一条条SQL实现的。如果数据库真正支持transaction的话,你这段代码应该是可以的。
你可以确定一下看看commit()有没有被执行。
12:26:57.785728 trace system.db.CDbCommand query with SQL: SHOW COLUMNS FROM `_bpm_bProcessDefinition` 12:26:57.797717 trace system.db.CDbCommand query with SQL: SHOW CREATE TABLE `_bpm_bProcessDefinition` 12:26:57.803940 trace system.db.ar.CActiveRecord BProcessDefinition.insert() 12:26:57.810563 trace system.db.CDbCommand Executing SQL: INSERT INTO `_bpm_bProcessDefinition` (`description`, `name`, `version`) VALUES (:description, :name, :version) 12:26:57.815779 trace system.db.CDbCommand query with SQL: SHOW COLUMNS FROM `_bpm_bNode` 12:26:57.829281 trace system.db.CDbCommand query with SQL: SHOW CREATE TABLE `_bpm_bNode` 12:26:57.839529 trace system.db.ar.CActiveRecord BNode.insert() 12:26:57.843036 trace system.db.CDbCommand Executing SQL: INSERT INTO `_bpm_bNode` (`name`, `class_`, `bProcessDefinition_id`, `nodeCollectionIndex`) VALUES (:name, :class_, :bProcessDefinition_id, :nodeCollectionIndex) 12:26:57.848476 trace system.db.CDbCommand query with SQL: SHOW COLUMNS FROM `_bpm_bTransition` 12:26:57.858931 trace system.db.CDbCommand query with SQL: SHOW CREATE TABLE `_bpm_bTransition`
这是system.db.* catoragy输出的内容。错误给拦截了,没输出,但错误之前的save执行成功。
如果没有错误,也没看到您说的commit命令。不知道怎么才能显示。
rollback执行了么?
web显示的所有log在上面,不知道怎么显示commit和rollback的log。
按照上面的分析rollback应该没有意义,因为我查看了数据库,没出错之前的内容都提交到数据库了。
现在要确定的是rollBack()是否执行了。如果没有执行,那么你现在的情况都是可预计的。
你可以在rollback之前放个die('test')试试。
显示了test。但出错前的记录还是生成。
知道原因了。我的数据库表都用的MyISAM类型
其实 用MyISAM 也可以支持一定的事务虽然不完整…
innodb 以外, 在一种比较特殊的情况下,我会考虑建立一张临时表,写入数据 如果全成功了,就批量转入,毕竟转入的情况是mysql内部转入,安全系数会高一点, 而且innodb的速度 是一个头疼的地方.
DBA的工作我做不起来,所以只能YY