Yii2.0 事务的使用

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元履行的一系列操作,要么完全地履行,要么完全

地不履行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过

将一组相关操作组合为一个要么整个成功要么整个失败的单元,可以简化差错恢复并使使用程序更加可靠。一个逻

辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中

的一个逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

 准备:

  开头引入  use yii\base\Exception;

  数据库引擎innodb类型

 

$transaction = Yii::$app->db->beginTransaction();

        try {
            foreach($data as $key => $item) {
                $car = AdminExcel::addCarMessage($item['car_number'],$rcid);//添加车牌
                if ($car) {
                   throw new Exception("第{$key}行".current($car)[0]);
                }
//                $car_id = AdminExcel::$car_id;
                //添加信息到供车关系表
                $res = AdminExcel::addCarManager($rcid,$item['type']);
                if($res)
                {
                   throw new Exception("第{$key}行".current($res)[0]);
                }
                $arrMain = [$item['true_name'],$item['phone'],$item['id_card']];
                $list =  AdminExcel::addInfoPerson($arrMain,1,$rcid);
                if($list)
                {
                    throw new Exception("第{$key}行".$list);
                }
               $arrPass =  [$item['true_name_f'],$item['phone_f'],$item['id_card_f']];
//                副驾驶
                $list2 =  AdminExcel::addInfoPerson($arrPass,2,$rcid);
                if($list2)
                {
                    throw new Exception($list2);
                }
            }
            $transaction->commit();
        } catch (Exception $e) {
            $transaction->rollBack();
            $error = $e->getMessage();  //获取抛出的错误
        }

 

当try中的数据循环全部插入到数据库中的时候,表示全部完成;如果中间有一条插入失败,那么之前插入的数据也被回滚掉。

补充:

优雅的写法

Yii::$app->db->transaction(function() {
    $order = new Order($customer);
    $order->save();
});

 

这相当于下列冗长的代码:

$transaction = Yii::$app->db->beginTransaction();
try {
    $order = new Order($customer);
    $order->save();
    $transaction->commit();
} catch (\Exception $e) {
    $transaction->rollBack();
    throw $e;
}

 

posted @ 2017-08-10 15:17  tengjian  阅读(447)  评论(0编辑  收藏  举报