日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Go?GORM?事務(wù)詳細(xì)介紹_Golang

作者:v2v1 ? 更新時(shí)間: 2022-09-24 編程語(yǔ)言

禁用默認(rèn)事務(wù)

為了確保數(shù)據(jù)一致性,GORM 會(huì)在事務(wù)里執(zhí)行寫入操作(創(chuàng)建、更新、刪除)。如果沒(méi)有這方面的要求,您可以在初始化時(shí)禁用它,這將獲得大約 30%+ 性能提升。

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

// 持續(xù)會(huì)話模式
tx := db.Session(&Session{SkipDefaultTransaction: true})
tx.First(&user, 1)
tx.Find(&users)
tx.Model(&user).Update("Age", 18)

事務(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
})

嵌套事務(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") // Rollback user2
  })

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

  return nil
})
// Commit user1, user3

手動(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()

一個(gè)特殊的示例

func CreateAnimals(db *gorm.DB) error {
  // 再嘮叨一下,事務(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
}

SavePoint、RollbackTo

GORM 提供了?SavePointRollbackto?來(lái)提供保存點(diǎn)以及回滾至保存點(diǎn),例如:

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

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

tx.Commit() // Commit user1

原文鏈接:https://learnku.com/docs/gorm/v2/transactions/9745

欄目分類
最近更新