From 5413b0d2bc203ec749911d5ac7d9da10c44b2f82 Mon Sep 17 00:00:00 2001 From: yedf2 <120050102@qq.com> Date: Sat, 15 Jan 2022 22:16:29 +0800 Subject: [PATCH] move Prepare outof CallWithDB --- dtmcli/msg.go | 14 ++++++++------ dtmsvr/api.go | 4 ++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/dtmcli/msg.go b/dtmcli/msg.go index 66ac5eb..6fba805 100644 --- a/dtmcli/msg.go +++ b/dtmcli/msg.go @@ -44,13 +44,15 @@ func (s *Msg) Submit() error { func (s *Msg) PrepareAndSubmit(queryPrepared string, db *sql.DB, busiCall BarrierBusiFunc) error { bb, err := BarrierFrom(s.TransType, s.Gid, "00", "msg") // a special barrier for msg QueryPrepared if err == nil { - err = bb.CallWithDB(db, func(tx *sql.Tx) error { - err := busiCall(tx) - if err == nil { - err = s.Prepare(queryPrepared) + err = s.Prepare(queryPrepared) + } + if err == nil { + defer func() { + if err != nil && bb.QueryPrepared(db) == ErrFailure { + _ = dtmimp.TransCallDtm(&s.TransBase, s, "abort") } - return err - }) + }() + err = bb.CallWithDB(db, busiCall) } if err == nil { err = s.Submit() diff --git a/dtmsvr/api.go b/dtmsvr/api.go index 83a1056..f2855f9 100644 --- a/dtmsvr/api.go +++ b/dtmsvr/api.go @@ -46,6 +46,10 @@ func svcPrepare(t *TransGlobal) interface{} { func svcAbort(t *TransGlobal) interface{} { dbt := GetTransGlobal(t.Gid) + if dbt.TransType == "msg" && dbt.Status == dtmcli.StatusPrepared { + dbt.changeStatus(dtmcli.StatusFailed) + return nil + } if t.TransType != "xa" && t.TransType != "tcc" || dbt.Status != dtmcli.StatusPrepared && dbt.Status != dtmcli.StatusAborting { return fmt.Errorf("trans type: '%s' current status '%s', cannot abort. %w", dbt.TransType, dbt.Status, dtmcli.ErrFailure) }