W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
?Model
?對象也可以通過?TX
?事務對象創(chuàng)建,通過事務對象創(chuàng)建的?Model
?對象與通過?DB
?數(shù)據(jù)庫對象創(chuàng)建的?Model
?對象功能是一樣的,只不過前者的所有操作都是基于事務,而當事務提交或者回滾后,對應的?Model
?對象不能被繼續(xù)使用,否則會返回錯誤。因為該?TX
?對象不能被繼續(xù)使用,一個事務對象僅對應于一個事務流程,?Commit/Rollback
?后即結束。
為方便事務操作,?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
})
}
我們也可以在鏈式操作中通過?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
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: