GoFrame 鏈式操作-事務處理

2022-04-02 10:45 更新

?Model?對象也可以通過?TX?事務對象創(chuàng)建,通過事務對象創(chuàng)建的?Model?對象與通過?DB?數(shù)據(jù)庫對象創(chuàng)建的?Model?對象功能是一樣的,只不過前者的所有操作都是基于事務,而當事務提交或者回滾后,對應的?Model?對象不能被繼續(xù)使用,否則會返回錯誤。因為該?TX?對象不能被繼續(xù)使用,一個事務對象僅對應于一個事務流程,?Commit/Rollback?后即結束。

示例1,通過Transaction

為方便事務操作,?gdb?提供了事務的閉包操作,通過?Transaction?方法實現(xiàn),該方法定義如下:

func (db DB) Transaction(ctx context.Context, f func(ctx context.Context, tx *TX) error) (err error)

當給定的閉包方法返回的?error?為?nil?時,那么閉包執(zhí)行結束后當前事務自動執(zhí)行?Commit?提交操作;否則自動執(zhí)行?Rollback?回滾操作。

如果閉包內部操作產生?panic?中斷,該事務也將進行回滾。

func Register() error {
	return db.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
		var (
			result sql.Result
			err    error
		)
		// 寫入用戶基礎數(shù)據(jù)
		result, err = tx.Table("user").Insert(g.Map{
			"name":  "john",
			"score": 100,
			//...
		})
		if err != nil {
			return err
		}
		// 寫入用戶詳情數(shù)據(jù),需要用到上一次寫入得到的用戶uid
		result, err = tx.Table("user_detail").Insert(g.Map{
			"uid":   result.LastInsertId(),
			"phone": "18010576258",
			//...
		})
		return err
	})
}

示例2,通過TX鏈式操作

我們也可以在鏈式操作中通過?TX?方法切換綁定的事務對象。多次鏈式操作可以綁定同一個事務對象,在該事務對象中執(zhí)行對應的鏈式操作。

func Register() error {
	var (
		uid int64
		err error
	)
	tx, err := g.DB().Begin()
	if err != nil {
		return err
	}
	// 方法退出時檢驗返回值,
	// 如果結果成功則執(zhí)行tx.Commit()提交,
	// 否則執(zhí)行tx.Rollback()回滾操作。
	defer func() {
		if err != nil {
			tx.Rollback()
		} else {
			tx.Commit()
		}
	}()
	// 寫入用戶基礎數(shù)據(jù)
	uid, err = AddUserInfo(tx, g.Map{
		"name":  "john",
		"score": 100,
		//...
	})
	if err != nil {
		return err
	}
	// 寫入用戶詳情數(shù)據(jù),需要用到上一次寫入得到的用戶uid
	err = AddUserDetail(tx, g.Map{
		"uid":   uid,
		"phone": "18010576259",
		//...
	})
	return err
}

func AddUserInfo(tx *gdb.TX, data g.Map) (int64, error) {
	result, err := g.Table("user").TX(tx).Data(data).Insert()
	if err != nil {
		return 0, err
	}
	uid, err := result.LastInsertId()
	if err != nil {
		return 0, err
	}
	return uid, nil
}

func AddUserDetail(tx *gdb.TX, data g.Map) error {
	_, err := g.Table("user_detail").TX(tx).Data(data).Insert()
	return err
}


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號