首页 > 开发 > PHP > 正文

Yii2中事务的使用实例代码详解

2024-05-04 22:52:58
字体:
来源:转载
供稿:网友

前言

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

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

准备

数据库引擎为innodb

本文使用的yii版本为2.0.5,只要是2.0以上就没有问题

运行环境为PHP7.0.0,Mysql5.6

Yii中的事务

处理异常

/*** 测试事务*/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 = 'ab'.$i;$test->sorta=1; //写入不存在的字段if(!$test->save()){"save fail"; //如果没有写入就输出}//提交$tr->commit();} catch (Exception $e) {//回滚$tr->rollBack();echo "rollback";}}

运行结果

save 1 | save 2 | save 3 | rollback

注意,因为最后的数据没有插入成功,触发了事务的回滚,所以数据表没有新增数据产生。

触发事务回滚的原因是代码出现了异常(Exception)。

处理数据失败

一般来讲,我们的运行中的代码是不会出现这种明显的异常,这种异常会在开发测试过程中消灭掉。

而真正造成数据需要回滚的是我们的某个业务出现问题,导致没有写入部分的数据。

/*** 测试事务*/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()){echo "save fail"; //如果没有写入就输出}//提交$tr->commit();} catch (Exception $e) {//回滚$tr->rollBack();echo "rollback";}}

运行结果如下,数据库插入了三条数据。

save 1 | save 2 | save 3 | save fail

也就是说,如果因为业务逻辑导致某个数据表没有写入数据,也没有出现对应的回滚。

改进方案如下

/*** 测试事务*/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(); //手动抛出异常,再由下面捕获。}//提交$tr->commit();} catch (Exception $e) {//回滚$tr->rollBack();echo "rollback";}}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表