xa changed

This commit is contained in:
yedf2 2021-08-03 14:40:33 +08:00
parent cca406dca8
commit 2a36d597d7
3 changed files with 15 additions and 21 deletions

View File

@ -40,7 +40,7 @@ func CheckUserResponse(resp *resty.Response, err error) error {
if resp.IsError() { if resp.IsError() {
return errors.New(resp.String()) return errors.New(resp.String())
} else if strings.Contains(resp.String(), "FAILURE") { } else if strings.Contains(resp.String(), "FAILURE") {
return ErrUserFailure return ErrFailure
} }
} }
return err return err
@ -130,8 +130,8 @@ func callDtmSimple(dtm string, body interface{}, operation string) error {
return err return err
} }
// ErrUserFailure 表示用户返回失败,要求回滚 // ErrFailure 表示返回失败,要求回滚
var ErrUserFailure = errors.New("user return FAILURE") var ErrFailure = errors.New("transaction FAILURE")
// ErrDtmFailure 表示用户返回失败,要求回滚 // ResultSuccess 表示返回成功,可以进行下一步
var ErrDtmFailure = errors.New("dtm return FAILURE") var ResultSuccess = common.M{"dtm_result": "SUCCESS"}

View File

@ -66,7 +66,7 @@ func (xc *XaClient) HandleCallback(gid string, branchID string, action string) (
defer db.Close() defer db.Close()
xaID := gid + "-" + branchID xaID := gid + "-" + branchID
_, err := common.SdbExec(db, fmt.Sprintf("xa %s '%s'", action, xaID)) _, err := common.SdbExec(db, fmt.Sprintf("xa %s '%s'", action, xaID))
return M{"dtm_result": "SUCCESS"}, err return ResultSuccess, err
} }
@ -78,17 +78,13 @@ func (xc *XaClient) XaLocalTransaction(c *gin.Context, xaFunc XaLocalFunc) (ret
db := common.SdbAlone(xc.Conf) db := common.SdbAlone(xc.Conf)
defer func() { db.Close() }() defer func() { db.Close() }()
defer func() { defer func() {
var x interface{} x := recover()
_, err := common.SdbExec(db, fmt.Sprintf("XA end '%s'", xaBranch)) _, err := common.SdbExec(db, fmt.Sprintf("XA end '%s'", xaBranch))
if err != nil { if x == nil && rerr == nil && err == nil {
common.RedLogf("sql db exec error: %v", err)
}
if x = recover(); x != nil || IsFailure(ret, rerr) {
} else {
_, err = common.SdbExec(db, fmt.Sprintf("XA prepare '%s'", xaBranch)) _, err = common.SdbExec(db, fmt.Sprintf("XA prepare '%s'", xaBranch))
} }
if err != nil { if rerr == nil {
common.RedLogf("sql db exec error: %v", err) rerr = err
} }
if x != nil { if x != nil {
panic(x) panic(x)
@ -99,12 +95,10 @@ func (xc *XaClient) XaLocalTransaction(c *gin.Context, xaFunc XaLocalFunc) (ret
return return
} }
ret, rerr = xaFunc(db, xa) ret, rerr = xaFunc(db, xa)
if IsFailure(ret, rerr) { if rerr != nil {
return return
} }
ret, rerr = common.RestyClient.R(). _, rerr = callDtm(xc.Server, &M{"gid": xa.Gid, "branch_id": branchID, "trans_type": "xa", "status": "prepared", "url": xc.CallbackURL}, "registerXaBranch", &TransOptions{})
SetBody(&M{"gid": xa.Gid, "branch_id": branchID, "trans_type": "xa", "status": "prepared", "url": xc.CallbackURL}).
Post(xc.Server + "/registerXaBranch")
return return
} }

View File

@ -33,7 +33,7 @@ func xaNormal(t *testing.T) {
_, err := xc.XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { _, err := xc.XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) {
req := examples.GenTransReq(30, false, false) req := examples.GenTransReq(30, false, false)
resp, err := xa.CallBranch(req, examples.Busi+"/TransOutXa") resp, err := xa.CallBranch(req, examples.Busi+"/TransOutXa")
if dtmcli.IsFailure(resp, err) { if err != nil {
return resp, err return resp, err
} }
return xa.CallBranch(req, examples.Busi+"/TransInXa") return xa.CallBranch(req, examples.Busi+"/TransInXa")
@ -49,13 +49,13 @@ func xaRollback(t *testing.T) {
_, err := xc.XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { _, err := xc.XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) {
req := &examples.TransReq{Amount: 30, TransInResult: "FAILURE"} req := &examples.TransReq{Amount: 30, TransInResult: "FAILURE"}
resp, err := xa.CallBranch(req, examples.Busi+"/TransOutXa") resp, err := xa.CallBranch(req, examples.Busi+"/TransOutXa")
if dtmcli.IsFailure(resp, err) { if err != nil {
return resp, err return resp, err
} }
return xa.CallBranch(req, examples.Busi+"/TransInXa") return xa.CallBranch(req, examples.Busi+"/TransInXa")
}) })
assert.Error(t, err) assert.Error(t, err)
WaitTransProcessed(gid) WaitTransProcessed(gid)
assert.Equal(t, []string{"succeed", "prepared"}, getBranchesStatus(gid)) assert.Equal(t, []string{"succeed", "prepared", "succeed", "prepared"}, getBranchesStatus(gid))
assert.Equal(t, "failed", getTransStatus(gid)) assert.Equal(t, "failed", getTransStatus(gid))
} }