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; }