数据库批量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。但出错前的记录还是生成。

如果这样,你得看看是不是你的数据库不支持transaction。

http://us.php.net/pdo-mysql

知道原因了。我的数据库表都用的MyISAM类型

<_<

其实 用MyISAM 也可以支持一定的事务虽然不完整…

innodb 以外, 在一种比较特殊的情况下,我会考虑建立一张临时表,写入数据 如果全成功了,就批量转入,毕竟转入的情况是mysql内部转入,安全系数会高一点, 而且innodb的速度 是一个头疼的地方.

DBA的工作我做不起来,所以只能YY