Yii2 事务处理try中的代码手动抛出的异常,sql不会回滚 [ 2.0 版本 ]
目前遇到的问题是
手动抛出的异常sql不会回滚,如果是sql异常(插入的数据中表中没有那个字段)sql才会回滚。
php版本 5.5.38
mysql版本5.1.73
求高手大大解答指教。
代码入下
===============================
用这种执行sql方式,手动抛出异常事务是可以回滚的。
========================================================
第三次更新
如图
还用原来的代码 我第三步手动抛出异常,不回滚的情况下按理说第一二步都会提交执行sql,但出现的问题是 只第一步update sql提交执行了 第二步的批量插入没有执行,说明第二步的回滚了吧
共 9 个回答
-
johnny1991 回答于 2017-06-20 11:12 举报
$transaction = Yii::$app->db->beginTransaction(); try{ xxxx }catch (Exception $e) { $transaction->rollBack(); throw $e; } $transaction->commit(); return true;
共 5 条回复johnny1991 回复于 2017-06-20 11:54 回复@leonyl
catch (Exception $e) {
$transaction->rollback();
return $e->getMessage();
}
你要注意在的catch里面return掉,不然会继续往下执行的@johnny1991 恩恩 我在回滚那的errorData()封装的有exit();
johnny1991 回复于 2017-06-20 14:31 回复@leonyl 那我能想到的只有一种情况了,就是你这个代码外面还有没有套在其他的transaction里面?
@johnny1991 没有 没有,只有一个事务。。。
现在发现的问题是,如果在操作第二张表的时候,插入的某字段数据库没有的话,这时候sql是没提交执行的,也就是说这样是预期的那样。如果是手动抛出的异常,代码可以走到catch里面,但是第一步操作的表里的数据变了。 -
楼主,解决了吗?我遇到同样的问题了,用嵌套事务也是有问题
共 3 条回复http://www.cnblogs.com/xweiwei/archive/2012/11/21/2780497.html
4.使用事务 用这个方法正常,数据库可以回滚。如果我屏蔽下边的语句,就能回滚
//上边是执行事务 $number =$a->id;//上面获取到自增逐渐 $arr=array('www.1.com','www.2.com','www.3.com'); Yii::$app->db->createCommand(" CREATE TABLE `b_{$number}` ( `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '名称', `domain` varchar(255) DEFAULT '' COMMENT '域名', `is_delete` int(10) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `domain` (`domain`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='b表_{$number}'; ")->execute(); foreach ($arr as $k=>$v){ $data[] = '("' . 'null' . '", "' . '' . '", "' . $v . '", "' .'0'. '")'; } $query = "INSERT INTO b_{$a->id} (id,name,domain,is_delete)VALUES" . implode(',', $data); $result=$connection->createCommand($query)->execute(); if(!$result){ throw new \Exception('添加失败'); } //下边捕获异常,try catch
加了的话,不出错误,能正常提交;
如果模拟错误,直接抛异常的,而且不能捕获到
leonyl
最后登录:2020-07-22
在线时长:1小时33分
- 粉丝1
- 金钱70
- 威望0
- 积分80