日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?事務(wù)處理

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

成都創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)10年來致力于為客戶提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了成百上千網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。

示例1,通過Transaction

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

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

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

如果閉包內(nèi)部操作產(chǎn)生?panic?中斷,該事務(wù)也將進(jìn)行回滾。

func Register() error {
	return db.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
		var (
			result sql.Result
			err    error
		)
		// 寫入用戶基礎(chǔ)數(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鏈?zhǔn)讲僮?

我們也可以在鏈?zhǔn)讲僮髦型ㄟ^?TX?方法切換綁定的事務(wù)對象。多次鏈?zhǔn)讲僮骺梢越壎ㄍ粋€(gè)事務(wù)對象,在該事務(wù)對象中執(zhí)行對應(yīng)的鏈?zhǔn)讲僮鳌?/p>

func Register() error {
	var (
		uid int64
		err error
	)
	tx, err := g.DB().Begin()
	if err != nil {
		return err
	}
	// 方法退出時(shí)檢驗(yàn)返回值,
	// 如果結(jié)果成功則執(zhí)行tx.Commit()提交,
	// 否則執(zhí)行tx.Rollback()回滾操作。
	defer func() {
		if err != nil {
			tx.Rollback()
		} else {
			tx.Commit()
		}
	}()
	// 寫入用戶基礎(chǔ)數(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
}

本文題目:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?事務(wù)處理
網(wǎng)頁網(wǎng)址:http://www.5511xx.com/article/dhhdjsg.html