From d9219c3bc1b00b5baa02384a2bb3617875343c9b Mon Sep 17 00:00:00 2001 From: yedf2 <120050102@qq.com> Date: Wed, 2 Feb 2022 21:47:12 +0800 Subject: [PATCH] defer op refactored --- dtmcli/dtmimp/trans_xa_base.go | 36 ++++++++++++---------------------- dtmgrpc/tcc.go | 19 +++++------------- 2 files changed, 17 insertions(+), 38 deletions(-) diff --git a/dtmcli/dtmimp/trans_xa_base.go b/dtmcli/dtmimp/trans_xa_base.go index 591aaf4..bea23e9 100644 --- a/dtmcli/dtmimp/trans_xa_base.go +++ b/dtmcli/dtmimp/trans_xa_base.go @@ -44,23 +44,17 @@ func (xc *XaClientBase) HandleLocalTrans(xa *TransBase, cb func(*sql.DB) error) return } defer func() { _ = db.Close() }() - defer func() { - x := recover() - _, err := DBExec(db, GetDBSpecial().GetXaSQL("end", xaBranch)) - if x == nil && rerr == nil && err == nil { - _, err = DBExec(db, GetDBSpecial().GetXaSQL("prepare", xaBranch)) - } - if rerr == nil { - rerr = err - } - if x != nil { - panic(x) - } - }() + defer DeferDo(&rerr, func() error { + _, err := DBExec(db, GetDBSpecial().GetXaSQL("prepare", xaBranch)) + return err + }, func() error { + return nil + }) _, rerr = DBExec(db, GetDBSpecial().GetXaSQL("start", xaBranch)) if rerr != nil { return } + defer DBExec(db, GetDBSpecial().GetXaSQL("end", xaBranch)) rerr = cb(db) return } @@ -72,17 +66,11 @@ func (xc *XaClientBase) HandleGlobalTrans(xa *TransBase, callDtm func(string) er return } // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 - defer func() { - x := recover() - operation := If(x != nil || rerr != nil, "abort", "submit").(string) - err := callDtm(operation) - if rerr == nil { // 如果用户函数没有返回错误,那么返回dtm的 - rerr = err - } - if x != nil { - panic(x) - } - }() + defer DeferDo(&rerr, func() error { + return callDtm("submit") + }, func() error { + return callDtm("abort") + }) rerr = callBusi() return } diff --git a/dtmgrpc/tcc.go b/dtmgrpc/tcc.go index 54a9e05..bbbaef8 100644 --- a/dtmgrpc/tcc.go +++ b/dtmgrpc/tcc.go @@ -41,20 +41,11 @@ func TccGlobalTransaction2(dtm string, gid string, custom func(*TccGrpc), tccFun return rerr } // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 - defer func() { - x := recover() - if x == nil && rerr == nil { - rerr = dtmgimp.DtmGrpcCall(&tcc.TransBase, "Submit") - return - } - err := dtmgimp.DtmGrpcCall(&tcc.TransBase, "Abort") - if rerr == nil { - rerr = err - } - if x != nil { - panic(x) - } - }() + defer dtmimp.DeferDo(&rerr, func() error { + return dtmgimp.DtmGrpcCall(&tcc.TransBase, "Submit") + }, func() error { + return dtmgimp.DtmGrpcCall(&tcc.TransBase, "Abort") + }) return tccFunc(tcc) }