DB::transaction中的失败处理

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

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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
chowjiawei
最佳答案

file

多个连接 db 需要指定连接

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

2年前 评论
test2018 2年前
chowjiawei (作者) 2年前
osang (楼主) 2年前
讨论数量: 35
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年前 评论

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