事务

事务依赖于 Orm 实例。Orm的用法可以参考Orm 增删改查

ORM 操作事务,支持两种范式。一种通过闭包的方式,由 Beego 本身来管理事务的生命周期。

  1. // Beego will manage the transaction's lifecycle
  2. // if the @param task return error, the transaction will be rollback
  3. // or the transaction will be committed
  4. err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
  5. // data
  6. user := new(User)
  7. user.Name = "test_transaction"
  8. // insert data
  9. // Using txOrm to execute SQL
  10. _, e := txOrm.Insert(user)
  11. // if e != nil the transaction will be rollback
  12. // or it will be committed
  13. return e
  14. })

在这种方式里面,第一个参数是task,即该事务所有完成的动作。注意的是,如果它返回了 error,那么 Beego 会将整个事务回滚。

否则提交事务。

另外一个要注意的是,如果在task执行过程中,发生了panic,那么 Beego 会回滚事务。

我们推荐使用这种方式。

另外一种方式,则是传统的由开发自己手动管理事务的生命周期

  1. o := orm.NewOrm()
  2. to, err := o.Begin()
  3. if err != nil {
  4. logs.Error("start the transaction failed")
  5. return
  6. }
  7. user := new(User)
  8. user.Name = "test_transaction"
  9. // do something with to. to is an instance of TxOrm
  10. // insert data
  11. // Using txOrm to execute SQL
  12. _, err = to.Insert(user)
  13. if err != nil {
  14. logs.Error("execute transaction's sql fail, rollback.", err)
  15. err = to.Rollback()
  16. if err != nil {
  17. logs.Error("roll back transaction failed", err)
  18. }
  19. } else {
  20. err = to.Commit()
  21. if err != nil {
  22. logs.Error("commit transaction failed.", err)
  23. }
  24. }

无论使用哪种方式,都应该注意到,只有通过TxOrm执行的 SQL 才会被认为是在一个事务里面。

  1. o := orm.NewOrm()
  2. to, err := o.Begin()
  3. // outside the txn
  4. o.Insert(xxx)
  5. // inside the txn
  6. to.Insert(xxx)

当然,从TxOrm里面衍生出来的QuerySeterQueryM2Mer,RawSeter也是被认为在事务里面。

和事务相关的方法有:

  1. // 需要自己管理事务生命周期
  2. Begin() (TxOrmer, error)
  3. BeginWithCtx(ctx context.Context) (TxOrmer, error)
  4. BeginWithOpts(opts *sql.TxOptions) (TxOrmer, error)
  5. BeginWithCtxAndOpts(ctx context.Context, opts *sql.TxOptions) (TxOrmer, error)
  6. // Beego 利用闭包管理生命周期
  7. DoTx(task func(ctx context.Context, txOrm TxOrmer) error) error
  8. DoTxWithCtx(ctx context.Context, task func(ctx context.Context, txOrm TxOrmer) error) error
  9. DoTxWithOpts(opts *sql.TxOptions, task func(ctx context.Context, txOrm TxOrmer) error) error
  10. DoTxWithCtxAndOpts(ctx context.Context, opts *sql.TxOptions, task func(ctx context.Context, txOrm TxOrmer) error) error