共計(jì) 1807 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。
如何分析 gorm 事務(wù),很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面丸趣 TV 小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
事務(wù)
gorm 事務(wù)
1. 禁用默認(rèn)事務(wù)
SkipDefaultTransaction 為了確保數(shù)據(jù)一致性,GORM 會(huì)在事務(wù)里執(zhí)行寫(xiě)入操作(創(chuàng)建、更新、刪除)。如果沒(méi)有這方面的要求,您可以在初始化時(shí)禁用它,這將獲得大約 30%+ 性能提升
// 全局禁用
db, err := gorm.Open(sqlite.Open( gorm.db), gorm.Config{
SkipDefaultTransaction: true,
// 持續(xù)會(huì)話(huà)模式
tx := db.Session(Session{SkipDefaultTransaction: true})
tx.First(user, 1)
tx.Find(users)
tx.Model(user).Update(Age , 18)
2. 事務(wù)
要在事務(wù)中執(zhí)行一系列操作,一般流程如下:
db.Transaction(func(tx *gorm.DB) error {
// 在事務(wù)中執(zhí)行一些 db 操作(從這里開(kāi)始,您應(yīng)該使用 tx 而不是 db) if err := tx.Create(Animal{Name: Giraffe}).Error; err != nil {
// 返回任何錯(cuò)誤都會(huì)回滾事務(wù)
return err
}
if err := tx.Create(Animal{Name: Lion}).Error; err != nil {
return err
}
// 返回 nil 提交事務(wù)
return nil
})
3. 嵌套事務(wù)
GORM 支持嵌套事務(wù),您可以回滾較大事務(wù)內(nèi)執(zhí)行的一部分操作
DB.Transaction(func(tx *gorm.DB) error { tx.Create( user1)
tx.Transaction(func(tx2 *gorm.DB) error { tx2.Create( user2)
return errors.New(rollback user2) // 回滾 user2
})
tx.Transaction(func(tx2 *gorm.DB) error { tx2.Create( user3)
return nil
})
return nil
// 僅提交 user1, user3
4. 手動(dòng)事務(wù)
// 開(kāi)始事務(wù)
tx := db.Begin()
// 在事務(wù)中執(zhí)行一些 db 操作(從這里開(kāi)始,您應(yīng)該使用 tx 而不是 db)tx.Create(...)
// ...
// 遇到錯(cuò)誤時(shí)回滾事務(wù)
tx.Rollback()
// 否則,提交事務(wù)
tx.Commit()
5. 一個(gè)特殊的示例
func CreateAnimals(db *gorm.DB) error {
// 再?lài)Z叨一下,事務(wù)一旦開(kāi)始,你就應(yīng)該使用 tx 處理數(shù)據(jù)
tx := db.Begin()
defer func() { if r := recover(); r != nil { tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return err
}
if err := tx.Create(Animal{Name: Giraffe}).Error; err != nil { tx.Rollback()
return err
}
if err := tx.Create(Animal{Name: Lion}).Error; err != nil { tx.Rollback()
return err
}
return tx.Commit().Error}
6.SavePoint、RollbackTo
GORM 提供了 SavePoint、Rollbackto 來(lái)提供保存點(diǎn)以及回滾至保存點(diǎn),例如
tx := DB.Begin()
tx.Create(user1)
tx.SavePoint(sp1)
tx.Create(user2)
tx.RollbackTo(sp1) // 回滾 user2
tx.Commit() // 最終僅提交 user1
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝您對(duì)丸趣 TV 的支持。