yii1框架,事务使用方法

Yii1框架事务操作方法如下:

1
2
3
$transaction= Yii::app()->db->beginTransaction();//创建事务
$transaction->commit();//提交事务
$transaction->rollback();//回滚事务

下面使用try,throw,catch配合使用事务:

复制代码
 1 // 以下实例将需要事务处理的操作放进try里
 2 $transaction = Yii::app()->db->beginTransaction();
 3 try {
 4     $a = XXX::model()->findByPk(X);
 5     $a->x = 1;
 6     $a->setAttribute('字段名', '值')
 7     //如果仅仅写为:$a->save(); 那么就算保存失败,也不会去执行catch里的内容
 8     if(!$a->save()){
 9         throw new CException('这里保存失败了,通知事务回滚');
10     }
11     
12     $b = YYY::model()->findByPk(Y);
13     $b->y = 2;
14     $b->setAttribute('字段名', '值')
15     if(!$b->save()){
16         throw new CException('这里保存失败了,通知事务回滚');
17     }
18     
19     //这里也可以调用其他方法,同样适用于事务,提交之前,对数据库的更改不可见23     
24     $transaction->commit(); //提交事务会真正的执行数据库操作
25 } catch (Exception $e) {
26     //如果操作失败, 数据回滚
27     $transaction->rollback(); 
28 }
复制代码

特别需要注意的是:我们之所以使用事务的目的,就是为了保证在一个代码块里面执行多个表的数据操作(新增,删除,修改)要么都成功,万事大吉,如果其中一个不成功,则撤销之前所有的操作,这里成功的意思不是指sql语句执行成功,而是说的相对应的数据操作要成功,该增加的要增加成功,该更新的要更新成功,该删除的要删除成功,当然了,如果在执行的过程中抛了异常,sql语句未执行成功,那最终执行影响成功的行数肯定是0。

在实际项目过程中,update table set 字段名 = 值 where id = 1,只要sql语句语法正确,但是id = 1 这条数据是不存在的,那么执行这条sql语句也是会成功的,只不过返回的影响的行数是0,所以我们在事务里面判断成不成功,不能以执行的结果为标准,而应该以执行成功影响的行数为标准。

例如一个事务里面要操作3个表的数据:

1 insert into table1 (字段1,字段2) values (值1,值2);(Affected rows: 1)
2 update table2 set 字段 = 值 where id = 1;(Affected rows: 0)
3 delete from table3 where id = 1;(Affected rows: 1)

单纯的执行这3个语句都是成功的,但是table2.id = 1 这条数据如果不存在,理论上要第二个更新语句成功了,才能执行第三个删除语句,所以就需要判断执行成功和影响的行数。

posted @   第一夫人  阅读(1120)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示