Mysql 事务嵌套问题

比如我控制器里面有事务,然后在事务里面调用Model的另一个事务

use Model;
Db::startTrans();
try{
    Db::name('table1')->update(1);
    Db::name('table2')->update(2);
    //另一个事务
    Model::update(2);
    Db::commit();
    }catch(){

    Db::rollback();
}
这样执行有什么错误吗?还是说执行完一个事务之后在执行另一个??

看了这个问题,不是很理解
https://segmentfault.com/q/10...

阅读 5.4k
2 个回答

我用个小例子说说

        $t1 = M('t1',null,$connection);
        $t2 = M('t2',null,$connection);

        // 开启t1 的事务
        $t1 -> startTrans();
        $t1 -> add(["t" => "xxx"]);

        // 开启 t2 的事务,所谓隐式,就是在这里提交了
        // 把上面的 事务中的 $t1 -> add(["t" => "xxx"]) 提交了
        // 因为下面的 t2 创建了新事务
        $t2 -> startTrans();
        // 下面的就是 t2 的事务了,与t1无关,因为t1 已经提交了
        $t2 -> add(["t" => "xx1"]);
        $t2 -> add(["t" => "xx2"]);
        // 提交 t2 事务
        $t1 -> commit();
        // 无意义了
        $t1 -> commit();

不建议使用嵌套事务,不管在哪一层回滚则全部回滚,即使你内层已经提交了,还是会回滚的,这根本不是嵌套关系。
还有一个事务就能解决的你所说的嵌套事务,干嘛还用嵌套

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏