DB::transaction中的失败处理

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

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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
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年前 评论

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