Browse Source

defer op refactored

topic
yedf2 5 years ago
parent
commit
d9219c3bc1
  1. 36
      dtmcli/dtmimp/trans_xa_base.go
  2. 19
      dtmgrpc/tcc.go

36
dtmcli/dtmimp/trans_xa_base.go

@ -44,23 +44,17 @@ func (xc *XaClientBase) HandleLocalTrans(xa *TransBase, cb func(*sql.DB) error)
return return
} }
defer func() { _ = db.Close() }() defer func() { _ = db.Close() }()
defer func() { defer DeferDo(&rerr, func() error {
x := recover() _, err := DBExec(db, GetDBSpecial().GetXaSQL("prepare", xaBranch))
_, err := DBExec(db, GetDBSpecial().GetXaSQL("end", xaBranch)) return err
if x == nil && rerr == nil && err == nil { }, func() error {
_, err = DBExec(db, GetDBSpecial().GetXaSQL("prepare", xaBranch)) return nil
} })
if rerr == nil {
rerr = err
}
if x != nil {
panic(x)
}
}()
_, rerr = DBExec(db, GetDBSpecial().GetXaSQL("start", xaBranch)) _, rerr = DBExec(db, GetDBSpecial().GetXaSQL("start", xaBranch))
if rerr != nil { if rerr != nil {
return return
} }
defer DBExec(db, GetDBSpecial().GetXaSQL("end", xaBranch))
rerr = cb(db) rerr = cb(db)
return return
} }
@ -72,17 +66,11 @@ func (xc *XaClientBase) HandleGlobalTrans(xa *TransBase, callDtm func(string) er
return return
} }
// 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题
defer func() { defer DeferDo(&rerr, func() error {
x := recover() return callDtm("submit")
operation := If(x != nil || rerr != nil, "abort", "submit").(string) }, func() error {
err := callDtm(operation) return callDtm("abort")
if rerr == nil { // 如果用户函数没有返回错误,那么返回dtm的 })
rerr = err
}
if x != nil {
panic(x)
}
}()
rerr = callBusi() rerr = callBusi()
return return
} }

19
dtmgrpc/tcc.go

@ -41,20 +41,11 @@ func TccGlobalTransaction2(dtm string, gid string, custom func(*TccGrpc), tccFun
return rerr return rerr
} }
// 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题
defer func() { defer dtmimp.DeferDo(&rerr, func() error {
x := recover() return dtmgimp.DtmGrpcCall(&tcc.TransBase, "Submit")
if x == nil && rerr == nil { }, func() error {
rerr = dtmgimp.DtmGrpcCall(&tcc.TransBase, "Submit") return dtmgimp.DtmGrpcCall(&tcc.TransBase, "Abort")
return })
}
err := dtmgimp.DtmGrpcCall(&tcc.TransBase, "Abort")
if rerr == nil {
rerr = err
}
if x != nil {
panic(x)
}
}()
return tccFunc(tcc) return tccFunc(tcc)
} }

Loading…
Cancel
Save