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

成都創(chuàng)新互聯(lián)技術(shù)團(tuán)隊10年來致力于為客戶提供網(wǎng)站設(shè)計制作、做網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗豐富的技術(shù)團(tuán)隊,先后服務(wù)、推廣了成百上千網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。
示例1,通過Transaction
為方便事務(wù)操作,?gdb?提供了事務(wù)的閉包操作,通過?Transaction?方法實現(xiàn),該方法定義如下:
func (db DB) Transaction(ctx context.Context, f func(ctx context.Context, tx *TX) error) (err error)當(dāng)給定的閉包方法返回的?error?為?nil?時,那么閉包執(zhí)行結(jié)束后當(dāng)前事務(wù)自動執(zhí)行?Commit?提交操作;否則自動執(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)讲僮骺梢越壎ㄍ粋€事務(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
}
// 方法退出時檢驗返回值,
// 如果結(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
} 文章標(biāo)題:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?事務(wù)處理
文章出自:http://fisionsoft.com.cn/article/dhhdjsg.html


咨詢
建站咨詢
