use tran data

This commit is contained in:
yedf2 2021-08-08 23:12:46 +08:00
parent ef4010c850
commit 5dfed596ad
5 changed files with 23 additions and 27 deletions

View File

@ -8,8 +8,7 @@ type Msg struct {
// MsgData msg data // MsgData msg data
type MsgData struct { type MsgData struct {
Gid string `json:"gid"` TransData
TransType string `json:"trans_type"`
Steps []MsgStep `json:"steps"` Steps []MsgStep `json:"steps"`
QueryPrepared string `json:"query_prepared"` QueryPrepared string `json:"query_prepared"`
} }
@ -23,10 +22,10 @@ type MsgStep struct {
// NewMsg create new msg // NewMsg create new msg
func NewMsg(server string, gid string) *Msg { func NewMsg(server string, gid string) *Msg {
return &Msg{ return &Msg{
MsgData: MsgData{ MsgData: MsgData{TransData: TransData{
Gid: gid, Gid: gid,
TransType: "msg", TransType: "msg",
}, }},
TransBase: TransBase{ TransBase: TransBase{
Dtm: server, Dtm: server,
}, },

View File

@ -8,8 +8,7 @@ type Saga struct {
// SagaData sage data // SagaData sage data
type SagaData struct { type SagaData struct {
Gid string `json:"gid"` TransData
TransType string `json:"trans_type"`
Steps []SagaStep `json:"steps"` Steps []SagaStep `json:"steps"`
} }
@ -23,10 +22,10 @@ type SagaStep struct {
// NewSaga create a saga // NewSaga create a saga
func NewSaga(server string, gid string) *Saga { func NewSaga(server string, gid string) *Saga {
return &Saga{ return &Saga{
SagaData: SagaData{ SagaData: SagaData{TransData: TransData{
Gid: gid, Gid: gid,
TransType: "saga", TransType: "saga",
}, }},
TransBase: TransBase{ TransBase: TransBase{
Dtm: server, Dtm: server,
}, },

View File

@ -9,7 +9,7 @@ import (
// Tcc struct of tcc // Tcc struct of tcc
type Tcc struct { type Tcc struct {
Gid string TransData
TransBase TransBase
} }
@ -21,12 +21,8 @@ type TccGlobalFunc func(tcc *Tcc) (*resty.Response, error)
// gid 全局事务id // gid 全局事务id
// tccFunc tcc事务函数里面会定义全局事务的分支 // tccFunc tcc事务函数里面会定义全局事务的分支
func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr error) { func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr error) {
data := &M{ tcc := &Tcc{TransBase: TransBase{Dtm: dtm}, TransData: TransData{Gid: gid, TransType: "tcc"}}
"gid": gid, rerr = tcc.CallDtm(&tcc.TransData, "prepare")
"trans_type": "tcc",
}
tcc := &Tcc{TransBase: TransBase{Dtm: dtm}, Gid: gid}
rerr = tcc.CallDtm(data, "prepare")
if rerr != nil { if rerr != nil {
return rerr return rerr
} }
@ -34,7 +30,7 @@ func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr e
defer func() { defer func() {
x := recover() x := recover()
operation := If(x == nil && rerr == nil, "submit", "abort").(string) operation := If(x == nil && rerr == nil, "submit", "abort").(string)
err := tcc.CallDtm(data, operation) err := tcc.CallDtm(&tcc.TransData, operation)
if rerr == nil { if rerr == nil {
rerr = err rerr = err
} }
@ -51,7 +47,7 @@ func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr e
func TccFromQuery(qs url.Values) (*Tcc, error) { func TccFromQuery(qs url.Values) (*Tcc, error) {
tcc := &Tcc{ tcc := &Tcc{
TransBase: *TransBaseFromQuery(qs), TransBase: *TransBaseFromQuery(qs),
Gid: qs.Get("gid"), TransData: TransData{Gid: qs.Get("gid"), TransType: "tcc"},
} }
if tcc.Dtm == "" || tcc.Gid == "" { if tcc.Dtm == "" || tcc.Gid == "" {
return nil, fmt.Errorf("bad tcc info. dtm: %s, gid: %s parentID: %s", tcc.Dtm, tcc.Gid, tcc.parentID) return nil, fmt.Errorf("bad tcc info. dtm: %s, gid: %s parentID: %s", tcc.Dtm, tcc.Gid, tcc.parentID)

View File

@ -46,6 +46,12 @@ type TransResult struct {
Message string Message string
} }
// TransData 每个全局事务都有的数据
type TransData struct {
Gid string `json:"gid"`
TransType string `json:"trans_type"`
}
// TransBase 事务的基础类 // TransBase 事务的基础类
type TransBase struct { type TransBase struct {
IDGenerator IDGenerator

View File

@ -26,13 +26,13 @@ type XaClient struct {
// Xa xa transaction // Xa xa transaction
type Xa struct { type Xa struct {
Gid string TransData
TransBase TransBase
} }
// XaFromQuery construct xa info from request // XaFromQuery construct xa info from request
func XaFromQuery(qs url.Values) (*Xa, error) { func XaFromQuery(qs url.Values) (*Xa, error) {
xa := &Xa{TransBase: *TransBaseFromQuery(qs), Gid: qs.Get("gid")} xa := &Xa{TransBase: *TransBaseFromQuery(qs), TransData: TransData{Gid: qs.Get("gid"), TransType: "xa"}}
if xa.Gid == "" || xa.parentID == "" { if xa.Gid == "" || xa.parentID == "" {
return nil, fmt.Errorf("bad xa info: gid: %s parentid: %s", xa.Gid, xa.parentID) return nil, fmt.Errorf("bad xa info: gid: %s parentid: %s", xa.Gid, xa.parentID)
} }
@ -109,12 +109,8 @@ func (xc *XaClient) XaLocalTransaction(qs url.Values, xaFunc XaLocalFunc) (ret i
// XaGlobalTransaction start a xa global transaction // XaGlobalTransaction start a xa global transaction
func (xc *XaClient) XaGlobalTransaction(gid string, xaFunc XaGlobalFunc) (rerr error) { func (xc *XaClient) XaGlobalTransaction(gid string, xaFunc XaGlobalFunc) (rerr error) {
xa := Xa{TransBase: TransBase{IDGenerator: IDGenerator{}, Dtm: xc.Server}, Gid: gid} xa := Xa{TransBase: TransBase{IDGenerator: IDGenerator{}, Dtm: xc.Server}, TransData: TransData{Gid: gid, TransType: "xa"}}
data := &M{ rerr = xa.CallDtm(&xa.TransData, "prepare")
"gid": gid,
"trans_type": "xa",
}
rerr = xa.CallDtm(data, "prepare")
if rerr != nil { if rerr != nil {
return return
} }
@ -123,7 +119,7 @@ func (xc *XaClient) XaGlobalTransaction(gid string, xaFunc XaGlobalFunc) (rerr e
defer func() { defer func() {
x := recover() x := recover()
operation := If(x != nil || rerr != nil, "abort", "submit").(string) operation := If(x != nil || rerr != nil, "abort", "submit").(string)
err := xa.CallDtm(data, operation) err := xa.CallDtm(&xa.TransData, operation)
if rerr == nil { // 如果用户函数没有返回错误那么返回dtm的 if rerr == nil { // 如果用户函数没有返回错误那么返回dtm的
rerr = err rerr = err
} }