全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 7 分钟 ✍️ juanwangdev

GORM 嵌套事务实现

GORM 通过保存点(SavePoint)机制支持嵌套事务,本文介绍其核心用法。

什么是嵌套事务

嵌套事务是在一个事务内部创建子事务的机制,允许部分回滚而不影响整个事务。

数据库原生不支持真正的事务嵌套,GORM 使用 SavePoint 模拟嵌套行为。

保存点语法

方法作用
SavePoint(name)创建命名保存点
RollbackTo(name)回滚到指定保存点

嵌套事务用法

使用 SavePoint

Go
tx := db.Begin()

// 第一个操作
if err := tx.Create(&user).Error; err != nil {
    tx.Rollback()
    return err
}

// 创建保存点
tx.SavePoint("before_order")

// 第二个操作
if err := tx.Create(&order).Error; err != nil {
    // 只回滚到保存点,不影响 user 创建
    tx.RollbackTo("before_order")
}

tx.Commit()

嵌套 Transaction 方法

Go
err := db.Transaction(func(tx *gorm.DB) error {
    tx.Create(&user)
    
    // 嵌套 Transaction 自动使用 SavePoint
    err := tx.Transaction(func(tx2 *gorm.DB) error {
        tx2.Create(&order)
        return errors.New("订单失败") // 只回滚 order,不影响 user
    })
    
    return nil
})

GORM 的 Transaction 方法检测到已存在事务时,自动使用 SavePoint 实现嵌套,无需手动管理。

注意事项

  • 保存点名称在同一事务内必须唯一
  • RollbackTo 只回滚到指定保存点,不结束事务
  • 嵌套事务的回滚不会影响外层事务的其他操作
  • 保存点机制依赖数据库支持,MySQL、PostgreSQL 均支持

要点总结

  • 使用 SavePoint(name) 创建保存点,RollbackTo(name) 回滚到保存点
  • 嵌套 Transaction 方法自动使用保存点机制
  • 嵌套回滚只影响保存点后的操作,不影响之前的操作
  • 保存点名称必须唯一

文章存放路径:D:\git2\jwdev\articles\GORM\进阶\事务处理\嵌套事务实现.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 事务隔离级别配置
下一篇 → GORM 创建钩子实现
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库