gorm事务控制
创建表
type Public struct {
gorm.Model
Name string
}
func CreateTables() {
db.AutoMigrate(&Public{})
}
手动控制事务
func test1() {
public := Public{
Name: "krien",
}
// 手动控制
tx := db.Begin()
tx.Create(&public)
err := tx.Create(nil).Error
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}
使用事务控制
要在事务中执行一系列操作,一般流程如下:
func test2() {
// 要在事务中执行一些db操作(从这里开始你应该使用“tx”,而不是“db”)
db.Transaction(func(tx *gorm.DB) error {
public := Public{
Name: "krien",
}
if err := tx.Create(&public).Error; err != nil {
// 返回任何错误都会回滚事务
return err
}
public2 := Public{
Name: "kite",
}
if err2 := tx.Create(&public2).Error; err2 != nil {
return err2
}
// 返回nil提交事务
return nil
})
}
嵌套事务
GORM支持嵌套事务,您可以回滚较大事务内执行的一部分操作
func test3() {
db.Transaction(func(tx *gorm.DB) error {
tx.Create(&public1)
tx.Transaction(func(tx2 *gorm.DB) error {
tx2.Create(&public2)
return errors.New("roll back public2")
})
tx.Transaction(func(tx2 *gorm.DB) error {
tx2.Create(&public3)
return nil
})
return nil
})
}
SavePoint 和 RollbackTo
通过SavePoint可以设置保存点,用RollbackTo可以回滚到设置的保存点
func test4 (){
tx := db.Begin()
tx.Create(&user1)
tx.SavePoint("sp1")
tx.Create(&user2)
tx.RollbackTo("sp1") // Rollback user2
tx.Commit() // Commit user1
}