DB::transaction中的失败处理

DB::transaction其中的一条query失败了,失败之前的create还是插入了新的数据记录。有办法回退create记录么?

\DB::transaction(function () use ($request) {
            $book = ProjectBook::create([
              ......
            ]); 
            $book->merchant()->create([
                #这里失败
            ]);
            ProjectBookTrack::create([
              ......
            ]);
        });

比如merchant这里失败了,但是book的记录还是创建了,有办法可以使create创建的记录回退吗?还是我的使用方式不对,请大佬指点

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
chowjiawei
最佳答案

file

多个连接 db 需要指定连接

DB::connection('连接名字')

1年前 评论
test2018 1年前
chowjiawei (作者) 1年前
osang (楼主) 1年前
讨论数量: 39

你的写法有问题啊 这样只有sql错误才会回滚,闭包事务的正确写法

DB::transaction(function () use ($request) {
    $r1 = DB::update(...);
    $r2 = DB::create(...);

    if( !$1 || !$2 ){
        throw new \Exception("抛出错误,捕捉不捕捉由你");
    }

    //没有异常抛出 $r1和$r2都会被自动提交
});
1年前 评论
唐章明 (作者) 1年前
osang (楼主) 1年前
fatrbaby 1年前
slowlyo
我一般是这样
DB::beginTransaction();
try {
    // ...
    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    // ...
}
1年前 评论
slowlyo (作者) 1年前
osang (楼主) 1年前
chowjiawei 1年前
osang (楼主) 1年前
chowjiawei 1年前
10944st 1年前
osang (楼主) 1年前
osang (楼主) 1年前
chowjiawei 1年前
10944st 1年前
osang (楼主) 1年前
osang (楼主) 1年前
osang (楼主) 1年前

就是你用法错了,要出现回滚,需要有数据库操作失败的时候,在匿名函数里抛出异常

1年前 评论
deatil (作者) 1年前
osang (楼主) 1年前
osang (楼主) 1年前
deatil (作者) 1年前

file真的假的,失败了,整个事务不都回滚了吗?book记录会成功?感觉不科学,我这边试了,复现不了。

Laravel

1年前 评论
osang (楼主) 1年前

您试试 多一个catch (Exception $exception) { DB::rollBack(); } 看看能不能捕获到

1年前 评论
chowjiawei

你有2个数据库 db需要指定连接 要不然回滚不生效

1年前 评论
osang (楼主) 1年前
chowjiawei

file

多个连接 db 需要指定连接

DB::connection('连接名字')

1年前 评论
test2018 1年前
chowjiawei (作者) 1年前
osang (楼主) 1年前

看你一下你的表引擎是否支持事务回滚

1年前 评论
osang (楼主) 1年前
Imuyu (作者) 1年前
osang (楼主) 1年前

我跟你也是一样的用法,无论是数据库create 、update 出错(比如数据库抛出某字段不能为空),还是代码出错(比如未定义的变量),都会回滚所有的数据库操作。 楼主可以写一个小demo放到git上,大家也可以下过来跑一下才知道

1年前 评论

代码没有任何问题,要不就try ,更新laravel 试试

1年前 评论

你在mysql的命令行敲一个事务看看,是不是本身你的mysql事务就“故障”了。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!