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

  • 相关阅读:
    洛谷P4113 [HEOI2012]采花
    洛谷P5159 WD与矩阵
    洛谷P1262 间谍网络
    洛谷P3038 牧草种植Grass Planting
    洛谷P3258 [JLOI2014]松鼠的新家
    洛谷P2294 [HNOI2005]狡猾的商人
    洛谷P4878 [USACO05DEC]layout布局
    【CF1132F】Clear the String (DP)
    [AH2017/HNOI2017]大佬(动态规划 搜索)
    「NOI2018」屠龙勇士(CRT)
  • 原文地址:https://www.cnblogs.com/firstlady/p/10649320.html
Copyright © 2020-2023  润新知