0

0

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

尼克

尼克

发布时间:2025-12-24 21:41:20

|

449人浏览过

|

来源于php中文网

原创

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

laravel如何实现数据库事务?(db facade示例)

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

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

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

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

示例:

Codiga
Codiga

可自定义的静态代码分析检测工具

下载
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']);
});

基本上就这些。用闭包方式最简洁可靠,手动控制只在特殊逻辑下需要。记住:事务不是万能的,它只保证数据库层面的一致性,不解决并发竞争(如超卖),必要时还需配合行锁或乐观锁。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

316

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

271

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

369

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

370

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

133

2025.07.29

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号