Gen Transaction

使用交易功能的程序如下

q := query.Use(db)

q.Transaction(func(tx *query.Query) error {
if _, err := tx.User.WithContext(ctx).Where(tx.User.ID.Eq(100)).Delete(); err != nil {
return err
}
if _, err := tx.Article.WithContext(ctx).Create(&model.User{Name:"modi"}); err != nil {
return err
}
return nil
})

巢狀交易

GEN 支援巢狀交易,您可以在較大交易範圍內回滾執行的一組作業,例如

q := query.Use(db)

q.Transaction(func(tx *query.Query) error {
tx.User.WithContext(ctx).Create(&user1)

tx.Transaction(func(tx2 *query.Query) error {
tx2.User.WithContext(ctx).Create(&user2)
return errors.New("rollback user2") // Rollback user2
})

tx.Transaction(func(tx3 *query.Query) error {
tx3.User.WithContext(ctx).Create(&user3)
return nil
})

return nil
})

// Commit user1, user3

手動交易

q := query.Use(db)

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

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

// ...

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

// Or commit the transaction
tx.Commit()

例如

q := query.Use(db)

func doSomething(ctx context.Context, users ...*model.User) (err error) {
tx := q.Begin()
defer func() {
if recover() != nil || err != nil {
_ = tx.Rollback()
}
}()

err = tx.User.WithContext(ctx).Create(users...)
if err != nil {
return
}
return tx.Commit()
}

儲存點/回滾至

GEN 提供 SavePointRollbackTo 來儲存點並回滾至儲存點,例如

tx := q.Begin()
txCtx = tx.WithContext(ctx)

txCtx.User.Create(&user1)

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

tx.Commit() // Commit user1

白金贊助商

金牌贊助商

白金贊助商

金牌贊助商