1. 程式人生 > 其它 >(十二)Beego模型之事務處理

(十二)Beego模型之事務處理

通常在一些訂單交易業務都會涉及多個表的更新/插入操作,這個時候就需要資料庫事務處理了,下面介紹beego orm如何處理mysql事務。

一、手動處理事務

// 建立orm物件
o := orm.NewOrm()

//  開始事務
tx, err := o.Begin()

// 開始執行各種sql語句,更新資料庫,這裡可以使用beego orm支援任何一種方式操作資料庫

// 例如,更新訂單狀態
_, err1 := tx.QueryTable("orders").Filter("Id", 1001).Update(orm.Params{
		"Status": "SUCCESS",
	})

// 給使用者加積分
_, err2 := tx.Raw("update users set points = points + ? where username=?", "tizi365", 100).Exec()

// 檢測事務執行狀態
if err1 != nil || err2 != nil {
	// 如果執行失敗,回滾事務
	tx.Rollback()
} else {
	// 任務執行成功,提交事務
	tx.Commit()
}

二、自動處理事務

在一個閉包函式內執行事務處理,如果函式返回error則回滾事務。

// 建立orm物件
o := orm.NewOrm()
// 在閉包內執行事務處理
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
    // 準備資料
    user := new(User)
    user.Name = "test_transaction"

    // 插入資料
    // 使用txOrm執行SQL
    _, e := txOrm.Insert(user)
    return e
})