没有不值得去解决的问题,也没有不值得去学习的技术!

Using Database Transactions in Laravel 6’s Eloquent ORM

当特地让事务失败时,即让第 3 个模型中插入一个不存在的字段,事务回滚,确认 3 张表中皆未插入数据

1. Use database transactions in Laravel 6’s Eloquent ORM. The application only uses PHP 7.0 and later, so replace \Exception with \Throwable. Reference:https://stackoverflow.com/questions/49814785/how-can-i-use-transaction-with-eloquent-laravel-5-5

2. The final implementation code is as follows


            DB::beginTransaction();
            try {

                $themeInstallation = new ThemeInstallation();
                $themeInstallation->theme_store_theme_id = $saasThemeConfig[$name]['id'];
                $themeInstallation->theme_id = $name;
                $themeInstallation->wp_theme_id = $wpTheme->id;
                $themeInstallation->theme_custom_name = $custom_name;
                $themeInstallation->save();

                $themeInstallationVersion = new ThemeInstallationVersion();
                $themeInstallationVersion->theme_installation_id = $themeInstallation->id;
                $themeInstallationVersion->theme_store_theme_id = $saasThemeConfig[$name]['id'];
                $themeInstallationVersion->theme_store_theme_version_id = $saasThemeConfig[$name]['id'];
                $themeInstallationVersion->save();

                $themeInstallationTask = new ThemeInstallationTask();
                $themeInstallationTask->theme_installation_id = $themeInstallation->id;
                $themeInstallationTask->theme_installation_version_id = $themeInstallationVersion->id;
                $themeInstallationTask->theme_store_theme_version_id = $saasThemeConfig[$name]['id'];
                $themeInstallationTask->save();

                DB::commit();
            } catch(\Throwable $e) {
                DB::rollBack();
                throw $e;
            }


3. When the transaction fails specially, the third model is inserted into a non-existent field, the transaction is rolled back, and the data is not inserted in the three tables. as shown in Figure 1

当特地让事务失败时,即让第 3 个模型中插入一个不存在的字段,事务回滚,确认 3 张表中皆未插入数据
Figure 1

{
    "message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'theme_store_theme_version_id' in 'field list' (SQL: insert into `theme_installation_task` (`processing`, `processing_failed`, `step`, `message`, `theme_installation_id`, `theme_installation_version_id`, `theme_store_theme_version_id`, `updated_at`, `created_at`) values (1, 0, 1, , 1, 1, 9, 2022-05-17 17:39:35, 2022-05-17 17:39:35))",
    "code": "42S22",
    "status_code": 500,
    "debug": {
        "line": 669,
        "file": "\\.\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php",
        "class": "Illuminate\\Database\\QueryException",
        "trace": {
		}
    }
}


4. When the transaction is successful, confirm that all data are inserted into the three tables.

需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理