Laravel如何实现数据库事务?(DB Facade示例)

发布时间 - 2025-12-24 00:00:00    点击率:
Laravel 中 DB::transaction() 方法可自动处理事务提交与回滚,推荐使用闭包方式:闭包正常结束则自动提交,抛出异常则自动回滚;支持 Eloquent 操作、多连接指定及手动控制(beginTransaction/commit/rollback),但不支持真正嵌套事务。

在 Laravel 中,使用 DB Facade 实现数据库事务非常简单,核心是 DB::transaction() 方法,它会自动处理提交与回滚,无需手动调用 commit()rollback()

基本用法:闭包方式(推荐)

最常用、最安全的方式是把需要原子执行的数据库操作写在闭包里。只要闭包中抛出异常(包括验证失败、逻辑错误、数据库约束冲突等),事务就会自动回滚。

  • 闭包内所有查询都在同一事务中执行
  • 闭包正常结束 → 自动提交
  • 闭包内抛出 ExceptionThrowable → 自动回滚

示例:

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进程池调度策略_任务分发说明【指导】  长沙企业网站制作哪家好,长沙水业集团官方网站?