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 这条数据如果不存在,理论上要第二个更新语句成功了,才能执行第三个删除语句,所以就需要判断执行成功和影响的行数。