【问题标题】:DB Transaction not rolling back [Laravel 7.3]数据库事务不回滚 [Laravel 7.3]
【发布时间】:2022-02-14 10:00:25
【问题描述】:

我在一个应用程序上运行 Laravel 7.3,我觉得这可能是一个 Laravel 框架错误,因为我正在为此绞尽脑汁......

我有一个数据库事务,其中包含模型保存,全部在 try/catch 中,但它仍在保存模型更新,我只是不明白为什么,因为它命中了 catch() 并且响应 json 命中,所以我假设回滚正在运行,但数据库仍在更新。

try {
    DB::beginTransaction();

    foreach ($models as $model) {
        $model->rungroup_id = $rungroup->id;
        $model->zone_id = $rungroup->getFirstZoneID();
        $model->delivery_status = 'next';
        $model->save();
    }

    DB::commit();

    return response()->json(['status' => 'success']);
} catch (Throwable | Exception $e) {
    DB::rollBack();

    Log::error($e);

    return response()->json([
        'status' => 'error',
        'message' => $e->getMessage(),
    ], 500);
}

有什么想法吗?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    在更新 Laravel 和许多其他尝试重写代码以查看我是否犯了一个愚蠢的错误之后,我最终发现创建数据库表的人将表引擎设置为 MyISAM 而不是 InnoDB 这是数据库事务需要...我希望 Laravel 抛出一个错误,这样我就知道了,但这确实挽救了我的理智,并希望它对其他人有所帮助。

    【讨论】:

    • 好收获。我建议您不要使用手动交易。您可以通过使用DB::transaction(function () { ... } 来完成相同的操作,而无需手动处理异常。您可以保留更简洁的代码,并且无论如何都会抛出异常。如果您需要针对特定​​异常的自定义响应,则可以使用异常处理程序。
    猜你喜欢
    • 2020-06-05
    • 2020-02-18
    • 2015-08-27
    • 1970-01-01
    • 2019-11-19
    • 2018-05-26
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多