You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang GORM开启SkipDefaultTransaction后创建表时事务报错

解决全局关闭默认事务后创建数据表的事务问题

当你全局设置SkipDefaultTransaction: true后,GORM不会自动为任何操作开启事务,之前出现"Invalid Transaction"错误,大概率是因为你没正确绑定事务会话就执行了表创建操作。

正确的做法是手动开启事务会话,所有表结构创建操作都通过这个会话执行:

  • 先用db.Begin()开启事务,得到事务对象tx
  • 所有CreateTable操作都使用这个tx对象,而不是原DB实例
  • 操作完成后提交事务,出错则回滚

示例代码:

// 开启事务
tx := db.Begin()
defer func() {
  if r := recover(); r != nil {
    tx.Rollback()
  }
}()

if err := tx.Error; err != nil {
  // 处理事务开启失败的错误
  panic(err)
}

// 用tx对象创建数据表
if err := tx.CreateTable(&User{}, &Product{}).Error; err != nil {
  tx.Rollback()
  panic(err)
}

// 提交事务
if err := tx.Commit().Error; err != nil {
  panic(err)
}

额外注意事项:

  • 不要混用原DB实例和事务会话对象,所有在事务内的操作必须用tx执行
  • 事务开启后一定要处理Commit和Rollback的逻辑,避免资源泄漏

内容的提问来源于stack exchange,提问作者Sutan Raihan Maulaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:45:33