2017-06-20 11:02:14 9297次浏览 9条回答 0 悬赏 10 金钱

目前遇到的问题是
手动抛出的异常sql不会回滚,如果是sql异常(插入的数据中表中没有那个字段)sql才会回滚。
php版本 5.5.38
mysql版本5.1.73
求高手大大解答指教。

补充于 2017-06-20 11:13

代码入下
CZ[G9WFN5N53S`T%]A_SC1M.png

补充于 2017-06-20 11:17

===============================

补充于 2017-06-21 10:38

7.png

用这种执行sql方式,手动抛出异常事务是可以回滚的。

补充于 2017-06-21 10:53

========================================================
第三次更新
8.png
如图
还用原来的代码 我第三步手动抛出异常,不回滚的情况下按理说第一二步都会提交执行sql,但出现的问题是 只第一步update sql提交执行了 第二步的批量插入没有执行,说明第二步的回滚了吧

  • 回答于 2017-06-20 11:08 举报

    代码呢????????????

    1 条回复
    回复于 2017-06-20 11:14 回复

    感谢大神关注,已上传

  • 回答于 2017-06-20 11:12 举报
    $transaction = Yii::$app->db->beginTransaction();
            try{
                xxxx
            }catch (Exception $e) {
                $transaction->rollBack();
                throw $e;
            }
            $transaction->commit();
            return true;
    
    5 条回复
    回复于 2017-06-20 11:16 回复

    感谢分享,刚试过,commit放在这个位置也不行的。。。

    回复于 2017-06-20 11:54 回复


    catch (Exception $e) {
    $transaction->rollback();
    return $e->getMessage();
    }
    你要注意在的catch里面return掉,不然会继续往下执行的

    回复于 2017-06-20 13:47 回复

    恩恩 我在回滚那的errorData()封装的有exit();

    回复于 2017-06-20 14:31 回复

    那我能想到的只有一种情况了,就是你这个代码外面还有没有套在其他的transaction里面?

    回复于 2017-06-20 14:44 回复

    没有 没有,只有一个事务。。。
    现在发现的问题是,如果在操作第二张表的时候,插入的某字段数据库没有的话,这时候sql是没提交执行的,也就是说这样是预期的那样。如果是手动抛出的异常,代码可以走到catch里面,但是第一步操作的表里的数据变了。

  • 回答于 2017-06-20 16:45 举报

    如果数据一样返回的也是0哦

  • 回答于 2017-06-20 17:13 举报

    不是太确信,可以尝试下面的思路试试:

    • throw 时使用 yii\db\Exception 而不是 \Exception;
    • 写一个测试 action, 把代码中其它无关内容移除,用两个简单的表,加上最简单的代码,模拟运行一下,看能否重现问题;
    1 条回复
    回复于 2017-06-21 10:40 回复

    早上得空用tp框架试了试,符合预期,完全没问题
    修改Yii代码,执行原生sql的方式也符合预期了,是不是跟yii的两种模型啥的有关系呢?

    觉得很赞
  • 回答于 2017-06-20 19:27 举报

    表类型支不支付事务啊,如果是mysql,把表引擎设置为InnoDB试下

    3 条回复
    回复于 2017-06-21 08:09 回复

    MyISAM引擎不支持事务

    回复于 2017-06-21 09:06 回复

    是啊,本想打InnoDB,打错了

    回复于 2017-06-21 10:42 回复

    更新了最新进展,大神有空可以看看

  • 回答于 2017-06-21 11:21 举报

    正常来说,按照规范,应该不会出现这个情况。这个事务我也有用,完全没有问题

    1 条回复
    回复于 2017-06-21 11:28 回复

    不追框架是不知道为啥了,用yii时间不长,问题就是这样如果是事务中用model::xxx方法操作的 都不会回滚
    可能是多库的原因?

  • 回答于 2017-06-22 09:37 举报

    我在try中写 if (!$model->save()) { return null;}, 你用trow能断掉后面的吗

    1 条回复
    回复于 2017-06-22 10:58 回复

    抛出异常后面的不执行

  • 回答于 2017-07-18 13:52 举报

    楼主,解决了吗?我遇到同样的问题了,用嵌套事务也是有问题

    3 条回复
    回复于 2017-07-19 15:46 回复

    http://www.cnblogs.com/xweiwei/archive/2012/11/21/2780497.html
    4.使用事务 用这个方法正常,数据库可以回滚。

    回复于 2017-07-20 11:23 回复

    如果我屏蔽下边的语句,就能回滚

                //上边是执行事务
                $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 
    

    加了的话,不出错误,能正常提交;
    如果模拟错误,直接抛异常的,而且不能捕获到

    回复于 2017-07-20 15:37 回复

    额 ,事务里面建表,我没碰到过这种情况。。。
    多试试吧

  • 回答于 2017-07-28 18:37 举报

    图一的情况,你抛了异常,然后捕获到异常里吗?其实由于你抛了异常commit没有执行到,其实不用回滚也行的

您需要登录后才可以回答。登录 | 立即注册
leonyl
职场新人

leonyl

注册时间:2017-06-20
最后登录:2020-07-22
在线时长:1小时33分
  • 粉丝1
  • 金钱70
  • 威望0
  • 积分80

热门问题