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传递给前端【方法】
如何快速生成可下载的建站源码工具?


项与最佳实践