使用交易功能的程序如下
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") })
tx.Transaction(func(tx3 *query.Query) error { tx3.User.WithContext(ctx).Create(&user3) return nil })
return nil })
|
手動交易
q := query.Use(db)
tx := q.Begin()
tx.User.WithContext(ctx).Create(...)
tx.Rollback()
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 提供 SavePoint
、RollbackTo
來儲存點並回滾至儲存點,例如
tx := q.Begin() txCtx = tx.WithContext(ctx)
txCtx.User.Create(&user1)
tx.SavePoint("sp1") txCtx.Create(&user2) tx.RollbackTo("sp1")
tx.Commit()
|