久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何分析gorm事務(wù)

共計(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 的支持。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-03發(fā)表,共計(jì)1807字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 巨野县| 韶关市| 黄浦区| 杭锦旗| 温泉县| 留坝县| 霍山县| 宾川县| 英德市| 潍坊市| 三门峡市| 灵台县| 满洲里市| 土默特右旗| 雅安市| 同德县| 泗洪县| 沁阳市| 江城| 前郭尔| 宁城县| 关岭| 宁强县| 泾源县| 西藏| 广南县| 唐海县| 那坡县| 巨野县| 视频| 南溪县| 万盛区| 山阳县| 铜川市| 革吉县| 安溪县| 永清县| 江安县| 阿拉善盟| 宁陵县| 益阳市|