Laravel DB事务怎么使用_Laravel数据库事务回滚操作

发布时间 - 2025-12-21 00:00:00    点击率:
使用DB::transaction()可确保数据库操作原子性,如余额扣减与记录写入同时成功或回滚;支持手动事务控制,适用于复杂逻辑;需避免耗时操作、合理使用行锁,并注意事务生命周期与队列重试问题。

在 Laravel 中使用数据库事务可以确保一组数据库操作要么全部成功,要么全部失败回滚,从而保证数据的一致性。特别是在处理多表写入、更新或删除等关键业务逻辑时,事务非常有用。

1. 使用 DB::transaction() 开启事务

最常见的方式是使用 DB::transaction() 方法包裹需要原子执行的代码块。如果代码块内抛出异常,Laravel 会自动触发回滚;如果没有异常,则自动提交事务。

use Illuminate\Support\Facades\DB;

DB::transaction(function () {
    $user = DB::table('users')->where('id', 1)->lockForUpdate()->first();

    if ($user->balance         throw new \Exception('余额不足');
    }

    DB::table('users')->where('id', 1)->decrement('balance', 50);
    DB::table('transactions')->insert([
        'user_id' => 1,
        'amount' => -50,
        'created_at' => now(),
        'updated_at' => now()
    ]);
});

上面的例子中,如果余额不足抛出异常,两个数据库操作都会被回滚。

2. 手动控制事务(begin、commit、rollback)

你也可以手动开启事务,适用于更复杂的控制逻辑。

DB::beginTransaction();

try {
    DB::table('users')->where('id', 1)->decrement('balance', 50);
    DB::table('logs')->insert([
        'action' => 'deduct_balance',
        'user_id' => 1,
        'created_at' => now(),
        'updated_at' => now()
    ]);

    DB::commit(); // 提交事务
} catch (\Exception $e) {
    DB::rollBack(); // 回滚事务
    // 可以记录日志或重新抛出异常
    report($e);
}

这种方式适合需要捕获异常并进行额外处理的场景。

3. 注意事项与最佳实践

  • 事务中尽量避免耗时操作(如远程请求),以免长时间锁表影响性能
  • 使用 lockForUpdate() 可防止并发修改导致的数据不一致
  • 事务不能跨 HTTP 请求,只在当前请求生命周期内有效
  • 在队列任务中使用事务时,注意任务失败重试可能引发重复提交问题

基本上就这些。合理使用 Laravel 的事务机制,能有效保障关键业务的数据完整性。不复杂但容易忽略细节。


# laravel  # cad  # if  # try  # throw  # catch  # 并发  # function  # table  # 数据库  # http  # 抛出  # 适用于  # 重试  # 是在  # 长时间  # 如果没有  # 或删除  # 只在  # 你也可以  # 最常见 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: 如何自定义建站之星模板颜色并下载新样式?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在新浪SAE免费搭建个人博客?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Android自定义listview布局实现上拉加载下拉刷新功能  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何为API生成Swagger或OpenAPI文档  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  制作电商网页,电商供应链怎么做?  Thinkphp 中 distinct 的用法解析  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Bootstrap CSS布局之列表  如何用已有域名快速搭建网站?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何用美橙互联一键搭建多站合一网站?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Python文件流缓冲机制_IO性能解析【教程】  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在香港免费服务器上快速搭建网站?  如何在腾讯云服务器快速搭建个人网站?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何用PHP工具快速搭建高效网站?  Laravel如何实现本地化和多语言支持?(i18n教程)  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  奇安信“盘古石”团队突破 iOS 26.1 提权  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel怎么调用外部API_Laravel Http Client客户端使用  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  开心动漫网站制作软件下载,十分开心动画为何停播?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何快速生成可下载的建站源码工具?