デフォルトトランザクションを無効にする 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 )
トランザクション トランザクション内で一連の操作を実行する場合、一般的なフローは以下のようになります。
db.Transaction(func (tx *gorm.DB) error { if err := tx.Create(&Animal{Name: "Giraffe" }).Error; err != nil { return err } if err := tx.Create(&Animal{Name: "Lion" }).Error; err != nil { return err } 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" ) }) tx.Transaction(func (tx3 *gorm.DB) error { tx3.Create(&user3) return nil }) return nil })
トランザクションを手動で制御する Gormでは、トランザクションを制御する関数 (commit / rollback) を直接呼び出すことができます。
tx := db.Begin() tx.Create(...) tx.Rollback() tx.Commit()
具体例 func CreateAnimals (db *gorm.DB) error { 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は SavePoint
, RollbackTo
メソッドを提供しています。これらのメソッドはそれぞれ、トランザクションの特定の地点を保存、保存された地点までロールバックが可能です。例:
tx := db.Begin() tx.Create(&user1) tx.SavePoint("sp1" ) tx.Create(&user2) tx.RollbackTo("sp1" ) tx.Commit()