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
相关产品推荐
相关产品推荐

