トランザクション

デフォルトトランザクションの無効化

GORMは、データの一貫性を確保するために、書き込み(作成/更新/削除)操作をトランザクション内で実行します。必要ない場合は、初期化中に無効にすることができます。これにより、約30%以上のパフォーマンス向上が得られます。

// Globally disable
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true,
})

// Continuous session mode
tx := db.Session(&Session{SkipDefaultTransaction: true})
tx.First(&user, 1)
tx.Find(&users)
tx.Model(&user).Update("Age", 18)

トランザクション

トランザクション内で一連の操作を実行するには、一般的な流れは以下のとおりです。

db.Transaction(func(tx *gorm.DB) error {
// do some database operations in the transaction (use 'tx' from this point, not 'db')
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// return any error will rollback
return err
}

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

// return nil will commit the whole transaction
return nil
})

ネストされたトランザクション

GORMはネストされたトランザクションをサポートしています。より大きなトランザクションのスコープ内で実行された操作のサブセットをロールバックできます。例:

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(tx3 *gorm.DB) error {
tx3.Create(&user3)
return nil
})

return nil
})

// Commit user1, user3

トランザクションの手動制御

GORMは、トランザクション制御関数(コミット/ロールバック)を直接呼び出すことをサポートしています。例:

// begin a transaction
tx := db.Begin()

// do some database operations in the transaction (use 'tx' from this point, not 'db')
tx.Create(...)

// ...

// rollback the transaction in case of error
tx.Rollback()

// Or commit the transaction
tx.Commit()

具体的な例

func CreateAnimals(db *gorm.DB) error {
// Note the use of tx as the database handle once you are within a transaction
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
}

セーブポイント, RollbackTo

GORMは、セーブポイントを保存し、セーブポイントにロールバックするためのSavePointRollbackToを提供します。例:

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

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

tx.Commit() // Commit user1

プラチナスポンサー

ゴールドスポンサー

プラチナスポンサー

ゴールドスポンサー