Laravel如何实现数据库事务?(DB Facade示例)
发布时间 - 2025-12-24 00:00:00 点击率:次Laravel 中 DB::transaction() 方法可自动处理事务提交与回滚,推荐使用闭包方式:闭包正常结束则自动提交,抛出异常则自动回滚;支持 Eloquent 操作、多连接指定及手动控制(beginTransaction/commit/rollback),但不支持真正嵌套事务。
在 Laravel 中,使用 DB Facade 实现数据库事务非常简单,核心是 DB::transaction() 方法,它会自动处理提交与回滚,无需手动调用 commit() 或 rollback()。
基本用法:闭包方式(推荐)
最常用、最安全的方式是把需要原子执行的数据库操作写在闭包里。只要闭包中抛出异常(包括验证失败、逻辑错误、数据库约束冲突等),事务就会自动回滚。
- 闭包内所有查询都在同一事务中执行
- 闭包正常结束 → 自动提交
- 闭包内抛出
Exception或Throwable→ 自动回滚
示例:
use Illuminate\Support\Facades\DB;
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->insert([
'title' => 'My first post',
'user_id' => 1
]);
// 如果这里抛出异常(比如字段超长、外键不存在),上面的 update 也会被撤销
throw new \Exception('模拟失败');
});
手动控制事务(较少用,但需了解)
当需要更精细的控制(比如条件性提交、嵌套判断、或在闭包外捕获异常做自定义处理)
时,可用手动方式:
- 先调用
DB::beginTransaction() - 执行操作,检查结果
- 成功则
DB::commit(),失败则DB::rollback()
示例:
DB::beginTransaction();
try {
DB::table('users')->decrement('balance', 100);
DB::table('transactions')->insert(['amount' => -100, 'user_id' => 1]);
DB::commit();
} catch (\Exception $e) {
DB::rollback();
throw $e;
}
注意嵌套事务和连接配置
Laravel 的事务默认作用于当前数据库连接(通常是 default 连接)。如果应用配置了多个数据库连接,需显式指定:
- 用
DB::connection('mysql2')->transaction(...)指定连接 - Laravel 不支持真正的嵌套事务;重复调用
transaction()不会新建事务,而是复用外层事务(底层依赖数据库是否支持 savepoint) - 若需部分回滚,可手动使用
DB::transactionLevel()和DB::rollBack(1)(慎用,可读性差)
结合 Eloquent 使用同样有效
DB::transaction() 对 Eloquent 操作完全兼容,因为 Eloquent 底层也走的是同一个数据库连接:
- 模型的
save()、delete()、update()等都会纳入事务 - 关联操作(如
$user->posts()->create(...))也受保护
示例:
DB::transaction(function () {
$user = User::find(1);
$user->balance -= 50;
$user->save();
$user->posts()->create(['title' => 'New post']);
});
基本上就这些。用闭包方式最简洁可靠,手动控制只在特殊逻辑下需要。记住:事务不是万能的,它只保证数据库层面的一致性,不解决并发竞争(如超卖),必要时还需配合行锁或乐观锁。
# mysql
# laravel
# cad
# 闭包
# delete
# 并发
# default
# 数据库
# 抛出
# 的是
# 就会
# 也会
# 多个
# 推荐使用
# 不存在
# 自定义
# 不支持
# 只在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速查询网址的建站时间与历史轨迹?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
文字头像制作网站推荐软件,醒图能自动配文字吗?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Android 常见的图片加载框架详细介绍
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
太平洋网站制作公司,网络用语太平洋是什么意思?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Linux安全能力提升路径_长期防护思维说明【指导】
高性价比服务器租赁——企业级配置与24小时运维服务
JS碰撞运动实现方法详解
Android使用GridView实现日历的简单功能
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
香港服务器如何优化才能显著提升网站加载速度?
浅析上传头像示例及其注意事项
EditPlus中的正则表达式实战(5)
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用低价快速搭建高质量网站?
Laravel如何使用Collections进行数据处理?(实用方法示例)
linux top下的 minerd 木马清除方法
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
如何实现javascript表单验证_正则表达式有哪些实用技巧
*服务器网站为何频现安全漏洞?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel Session怎么存储_Laravel Session驱动配置详解
python中快速进行多个字符替换的方法小结
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
微信小程序 canvas开发实例及注意事项
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
深圳网站制作的公司有哪些,dido官方网站?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
做企业网站制作流程,企业网站制作基本流程有哪些?
如何自定义建站之星网站的导航菜单样式?
PHP正则匹配日期和时间(时间戳转换)的实例代码
高防服务器如何保障网站安全无虞?
Laravel如何自定义分页视图?(Pagination示例)
网站图片在线制作软件,怎么在图片上做链接?
如何制作一个表白网站视频,关于勇敢表白的小标题?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Python进程池调度策略_任务分发说明【指导】
长沙企业网站制作哪家好,长沙水业集团官方网站?
上一篇:详解jQuery中基本的动画方法
上一篇:详解jQuery中基本的动画方法

