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
📝 发现内容有误?点击此处直接编辑