yii1框架,事务使用方法

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

$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 @ 2019-04-03 15:45  第一夫人  阅读(1116)  评论(0编辑  收藏  举报