学堂 学堂 学堂公众号手机端

如何分析gorm事务

lewis 1年前 (2024-04-29) 阅读数 16 #技术

如何分析gorm事务,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

事务

gorm事务

1.禁用默认事务

SkipDefaultTransaction 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。 如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升


//全局禁用
db,err:=gorm.Open(sqlite.Open("gorm.db"),&gorm.Config{
SkipDefaultTransaction:true,
})

//持续会话模式
tx:=db.Session(&Session{SkipDefaultTransaction:true})
tx.First(&user,1)
tx.Find(&users)
tx.Model(&user).Update("Age",18)

2.事务

要在事务中执行一系列操作,一般流程如下:

db.Transaction(func(tx*gorm.DB)error{
//在事务中执行一些db操作(从这里开始,您应该使用'tx'而不是'db')
iferr:=tx.Create(&Animal{Name:"Giraffe"}).Error;err!=nil{
//返回任何错误都会回滚事务
returnerr
}

iferr:=tx.Create(&Animal{Name:"Lion"}).Error;err!=nil{
returnerr
}

//返回nil提交事务
returnnil
})

3.嵌套事务

GORM 支持嵌套事务,您可以回滚较大事务内执行的一部分操作

DB.Transaction(func(tx*gorm.DB)error{
tx.Create(&user1)

tx.Transaction(func(tx2*gorm.DB)error{
tx2.Create(&user2)
returnerrors.New("rollbackuser2")//回滚user2
})

tx.Transaction(func(tx2*gorm.DB)error{
tx2.Create(&user3)
returnnil
})

returnnil
})

//仅提交user1,user3

4.手动事务

//开始事务
tx:=db.Begin()

//在事务中执行一些db操作(从这里开始,您应该使用'tx'而不是'db')
tx.Create(...)

//...

//遇到错误时回滚事务
tx.Rollback()

//否则,提交事务
tx.Commit()

5.一个特殊的示例

funcCreateAnimals(db*gorm.DB)error{
//再唠叨一下,事务一旦开始,你就应该使用tx处理数据
tx:=db.Begin()
deferfunc(){
ifr:=recover();r!=nil{
tx.Rollback()
}
}()

iferr:=tx.Error;err!=nil{
returnerr
}

iferr:=tx.Create(&Animal{Name:"Giraffe"}).Error;err!=nil{
tx.Rollback()
returnerr
}

iferr:=tx.Create(&Animal{Name:"Lion"}).Error;err!=nil{
tx.Rollback()
returnerr
}

returntx.Commit().Error
}

6.SavePoint、RollbackTo

GORM 提供了 SavePoint、Rollbackto 来提供保存点以及回滚至保存点,例如

tx:=DB.Begin()
tx.Create(&user1)

tx.SavePoint("sp1")
tx.Create(&user2)
tx.RollbackTo("sp1")//回滚user2

tx.Commit()//最终仅提交user1

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注博信行业资讯频道,感谢您对博信的支持。

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门