DB::transaction中的失败处理

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

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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
chowjiawei
最佳答案

file

多个连接 db 需要指定连接

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

2年前 评论
test2018 2年前
chowjiawei (作者) 2年前
osang (楼主) 2年前
讨论数量: 39
唐章明

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

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

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

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

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

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

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

Laravel

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

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

2年前 评论
chowjiawei

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

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

file

多个连接 db 需要指定连接

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

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

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

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

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

2年前 评论

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

2年前 评论

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

2年前 评论