YII使用事物的时候,遇到的一些小问题总结:开始事物,后要进行事物提交,才能操作数据库(折腾了一天)具体使用:
yii事物的定义:是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
Yii2.0 事物的应用:
$transaction = Yii::$app->db->beginTransaction(); try { $connection->createCommand($sql1)->execute(); //如果执行失败则抛出错误 if(status == false) throw new Exception('这里是错误原因'); $connection->createCommand($sql2)->execute(); $transaction->commit(); //只有执行了commit(),对于上面数据库的操作才会真正执行 }catch (Exception $e) { $error = $e->getMessage(); //获取抛出的错误 $transaction->rollBack(); }
以上即是数据库事务的简单应用。事务的应用在于多表操作,只有所有数据库操作都成功了,才会执行,其中一个地方失败,就不会执行,以保证数据库动作的完整性。
实例
下面是一个删除的事务实例,我们要达到的目的是删除model时也同时要删除relation,如果其中一步失败则callback
$transaction = Yii::$app->db->beginTransaction(); try{ //删除$model中的数据 $res = $model->deleteAll($cond); if(!$res) throw new Exception('操作失败!'); //删除$model对应的$relation中的数据 $rt = $relation->deleteAll(['polymeric_id'=>$cond['id']]); if(!$rt) throw new Exception('操作失败!'); //以上执行都成功,则对数据库进行实际执行 $transaction->commit(); return Helper::arrayReturn(['status'=>true]); }catch (Exception $e){ //如果抛出错误则进入catch,先callback,然后捕获错误,返回错误 $transaction->rollBack(); return Helper::arrayReturn(['status'=>false,'msg'=>$e->getMessage()]); }
我的示例代码:
$transaction = Yii::$app->db->beginTransaction(); try{ if(!$this->delForumThread($threadId)){ throw new Exception('操作失败!'); }; // 以上都执行成功 则对数据库进行实际的操作 $transaction->commit(); }catch(Exception $e){ $error = $e->getMessage(); //获取抛出的错误 $this->error($error); $transaction->rollBack(); };