Yii2中“事务”中只有一张表数据更新成功了却没有回滚?什么原因造成的?

已邀请:

zkbhj - 凯冰科技站长

赞同来自:

一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题。


数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的一个逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。


 
一般情况下,发生致命的异常时,是可以保证我们的事务正常运行的。但是这种异常一般在开发阶段或者测试阶段就解决掉了,但是上线之后还回出现这个问题。所以重点来了:
 


一般出现这种问题的原因是因为业务逻辑导致某个数据表没有写入数据,也没有出现对应的回滚。


 
改进方法就是需要在相应的节点进行手动抛异常!
 
 /**
* 测试事务
*/
public function actionTest(){
//创建事务
$tr = Yii::$app->db->beginTransaction();
try {
for($i=1;$i<=3;$i++){
$test = new Areas();
$test->name = 'name'.$i;
$test->sort=1;
if($test->save()){
echo "save $i | ";
}
}
$test = new Areas();
$test->name = null; //数据库设计name不能为空,人为造成写入失败。
$test->sort=1; //写入不存在的字段
if(!$test->save()){
throw new \yii\db\Exception(); [b]//手动抛出异常,再由下面捕获。
[/b] }
//提交
$tr->commit();
} catch (Exception $e) {
//回滚
$tr->rollBack();
echo "rollback";
}
}

要回复问题请先登录注册