change to submit and abort

This commit is contained in:
yedongfu 2021-07-03 12:00:52 +08:00
parent b45838187d
commit a151239863
18 changed files with 52 additions and 52 deletions

View File

@ -44,7 +44,7 @@ saga := dtm.SagaNew(DtmServer).
Add(startBusi+"/TransOut", startBusi+"/TransOutCompensate", req).
Add(startBusi+"/TransIn", startBusi+"/TransInCompensate", req)
// 提交saga事务
err := saga.Commit()
err := saga.Submit()
```
### 完整示例
参考[examples/quick_start.go](./examples/quick_start.go)

View File

@ -12,9 +12,9 @@ import (
func AddRoute(engine *gin.Engine) {
engine.POST("/api/dtmsvr/prepare", common.WrapHandler(Prepare))
engine.POST("/api/dtmsvr/commit", common.WrapHandler(Commit))
engine.POST("/api/dtmsvr/submit", common.WrapHandler(Submit))
engine.POST("/api/dtmsvr/branch", common.WrapHandler(Branch))
engine.POST("/api/dtmsvr/rollback", common.WrapHandler(Rollback))
engine.POST("/api/dtmsvr/abort", common.WrapHandler(Abort))
engine.GET("/api/dtmsvr/query", common.WrapHandler(Query))
}
@ -25,16 +25,16 @@ func Prepare(c *gin.Context) (interface{}, error) {
return M{"message": "SUCCESS", "gid": m.Gid}, nil
}
func Commit(c *gin.Context) (interface{}, error) {
func Submit(c *gin.Context) (interface{}, error) {
db := dbGet()
m := TransFromContext(c)
m.Status = "committed"
m.Status = "submitted"
m.SaveNew(db)
go m.Process(db)
return M{"message": "SUCCESS", "gid": m.Gid}, nil
}
func Rollback(c *gin.Context) (interface{}, error) {
func Abort(c *gin.Context) (interface{}, error) {
db := dbGet()
m := TransFromContext(c)
m = TransFromDb(db, m.Gid)

View File

@ -8,7 +8,7 @@ CREATE TABLE if not EXISTS `trans_global` (
`gid` varchar(128) NOT NULL COMMENT '事务全局id',
`trans_type` varchar(45) not null COMMENT '事务类型: saga | xa',
`data` TEXT COMMENT '事务携带的数据',
`status` varchar(45) NOT NULL COMMENT '全局事务的状态 prepared | committed | finished | rollbacked',
`status` varchar(45) NOT NULL COMMENT '全局事务的状态 prepared | submitted | finished | rollbacked',
`query_prepared` varchar(128) NOT NULL COMMENT 'prepared状态事务的查询api',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
@ -34,7 +34,7 @@ CREATE TABLE IF NOT EXISTS `trans_branch` (
`data` TEXT COMMENT '请求所携带的数据',
`branch` VARCHAR(128) NOT NULL COMMENT '事务分支名称',
`branch_type` varchar(45) NOT NULL COMMENT '事务分支类型 saga_action | saga_compensate | xa',
`status` varchar(45) NOT NULL COMMENT '步骤的状态 committed | finished | rollbacked',
`status` varchar(45) NOT NULL COMMENT '步骤的状态 submitted | finished | rollbacked',
`finish_time` datetime DEFAULT NULL,
`rollback_time` datetime DEFAULT NULL,
`create_time` datetime DEFAULT NULL,

View File

@ -62,7 +62,7 @@ func TestCover(t *testing.T) {
db := dbGet()
db.NoMust()
CronTransOnce(0, "prepared")
CronTransOnce(0, "committed")
CronTransOnce(0, "submitted")
defer handlePanic()
checkAffected(db.DB)
}
@ -134,31 +134,31 @@ func xaRollback(t *testing.T) {
func tccNormal(t *testing.T) {
tcc := genTcc("gid-tcc-normal", false, false)
tcc.Commit()
assert.Equal(t, "committed", getTransStatus(tcc.Gid))
tcc.Submit()
assert.Equal(t, "submitted", getTransStatus(tcc.Gid))
WaitTransProcessed(tcc.Gid)
assert.Equal(t, []string{"prepared", "succeed", "succeed", "prepared", "succeed", "succeed"}, getBranchesStatus(tcc.Gid))
}
func tccRollback(t *testing.T) {
tcc := genTcc("gid-tcc-rollback", false, true)
tcc.Commit()
tcc.Submit()
WaitTransProcessed(tcc.Gid)
assert.Equal(t, []string{"succeed", "prepared", "succeed", "succeed", "prepared", "failed"}, getBranchesStatus(tcc.Gid))
}
func tccRollbackPending(t *testing.T) {
tcc := genTcc("gid-tcc-rollback-pending", false, true)
examples.MainSwitch.TransInRevertResult.SetOnce("PENDING")
tcc.Commit()
tcc.Submit()
WaitTransProcessed(tcc.Gid)
// assert.Equal(t, "committed", getTransStatus(tcc.Gid))
CronTransOnce(60*time.Second, "committed")
// assert.Equal(t, "submitted", getTransStatus(tcc.Gid))
CronTransOnce(60*time.Second, "submitted")
assert.Equal(t, []string{"succeed", "prepared", "succeed", "succeed", "prepared", "failed"}, getBranchesStatus(tcc.Gid))
}
func msgNormal(t *testing.T) {
msg := genMsg("gid-normal-msg")
msg.Commit()
assert.Equal(t, "committed", getTransStatus(msg.Gid))
msg.Submit()
assert.Equal(t, "submitted", getTransStatus(msg.Gid))
WaitTransProcessed(msg.Gid)
assert.Equal(t, []string{"succeed", "succeed"}, getBranchesStatus(msg.Gid))
assert.Equal(t, "succeed", getTransStatus(msg.Gid))
@ -173,16 +173,16 @@ func msgPending(t *testing.T) {
assert.Equal(t, "prepared", getTransStatus(msg.Gid))
examples.MainSwitch.TransInResult.SetOnce("PENDING")
CronTransOnce(60*time.Second, "prepared")
assert.Equal(t, "committed", getTransStatus(msg.Gid))
CronTransOnce(60*time.Second, "committed")
assert.Equal(t, "submitted", getTransStatus(msg.Gid))
CronTransOnce(60*time.Second, "submitted")
assert.Equal(t, []string{"succeed", "succeed"}, getBranchesStatus(msg.Gid))
assert.Equal(t, "succeed", getTransStatus(msg.Gid))
}
func sagaNormal(t *testing.T) {
saga := genSaga("gid-noramlSaga", false, false)
saga.Commit()
assert.Equal(t, "committed", getTransStatus(saga.Gid))
saga.Submit()
assert.Equal(t, "submitted", getTransStatus(saga.Gid))
WaitTransProcessed(saga.Gid)
assert.Equal(t, []string{"prepared", "succeed", "prepared", "succeed"}, getBranchesStatus(saga.Gid))
transQuery(t, saga.Gid)
@ -190,7 +190,7 @@ func sagaNormal(t *testing.T) {
func sagaRollback(t *testing.T) {
saga := genSaga("gid-rollbackSaga2", false, true)
saga.Commit()
saga.Submit()
WaitTransProcessed(saga.Gid)
assert.Equal(t, "failed", getTransStatus(saga.Gid))
assert.Equal(t, []string{"succeed", "succeed", "succeed", "failed"}, getBranchesStatus(saga.Gid))
@ -199,10 +199,10 @@ func sagaRollback(t *testing.T) {
func sagaCommittedPending(t *testing.T) {
saga := genSaga("gid-committedPending", false, false)
examples.MainSwitch.TransInResult.SetOnce("PENDING")
saga.Commit()
saga.Submit()
WaitTransProcessed(saga.Gid)
assert.Equal(t, []string{"prepared", "prepared", "prepared", "prepared"}, getBranchesStatus(saga.Gid))
CronTransOnce(60*time.Second, "committed")
CronTransOnce(60*time.Second, "submitted")
assert.Equal(t, []string{"prepared", "succeed", "prepared", "succeed"}, getBranchesStatus(saga.Gid))
assert.Equal(t, "succeed", getTransStatus(saga.Gid))
}
@ -273,7 +273,7 @@ func TestSqlDB(t *testing.T) {
dbr = db.Model(&dtm.BarrierModel{}).Where("gid=?", "gid2").Find(&[]dtm.BarrierModel{})
asserts.Equal(dbr.RowsAffected, int64(0))
_, err = dtm.ThroughBarrierCall(db.ToSqlDB(), "saga", "gid2", "branch_id2", "compensate", func(db *sql.DB) (interface{}, error) {
logrus.Printf("commit gid2")
logrus.Printf("submit gid2")
return nil, nil
})
asserts.Nil(err)

View File

@ -143,7 +143,7 @@ func (t *TransGlobal) SaveNew(db *common.DB) {
DoNothing: true,
}).Create(&branches)
}
} else if dbr.RowsAffected == 0 && t.Status == "committed" { // 如果数据库已经存放了prepared的事务则修改状态
} else if dbr.RowsAffected == 0 && t.Status == "submitted" { // 如果数据库已经存放了prepared的事务则修改状态
dbr = db.Must().Model(t).Where("gid=? and status=?", t.Gid, "prepared").Select(append(updates, "status")).Updates(t)
}
return nil

View File

@ -63,13 +63,13 @@ func (t *TransGlobal) mayQueryPrepared(db *common.DB) {
t.touch(db, t.NextCronInterval*2)
}
} else if strings.Contains(body, "SUCCESS") {
t.changeStatus(db, "committed")
t.changeStatus(db, "submitted")
}
}
func (t *TransMsgProcessor) ProcessOnce(db *common.DB, branches []TransBranch) {
t.mayQueryPrepared(db)
if t.Status != "committed" {
if t.Status != "submitted" {
return
}
current := 0 // 当前正在处理的步骤

View File

@ -51,7 +51,7 @@ func (t *TransSagaProcessor) ExecBranch(db *common.DB, branch *TransBranch) {
}
func (t *TransSagaProcessor) ProcessOnce(db *common.DB, branches []TransBranch) {
if t.Status != "committed" {
if t.Status != "submitted" {
return
}
current := 0 // 当前正在处理的步骤

View File

@ -51,7 +51,7 @@ func (t *TransTccProcessor) ExecBranch(db *common.DB, branch *TransBranch) {
}
func (t *TransTccProcessor) ProcessOnce(db *common.DB, branches []TransBranch) {
if t.Status != "committed" {
if t.Status != "submitted" {
return
}
current := 0 // 当前正在处理的步骤

View File

@ -38,11 +38,11 @@ func (t *TransXaProcessor) ProcessOnce(db *common.DB, branches []TransBranch) {
if t.Status == "succeed" {
return
}
currentType := common.If(t.Status == "committed", "commit", "rollback").(string)
currentType := common.If(t.Status == "submitted", "commit", "rollback").(string)
for _, branch := range branches {
if branch.BranchType == currentType && branch.Status != "succeed" {
t.ExecBranch(db, &branch)
}
}
t.changeStatus(db, common.If(t.Status == "committed", "succeed", "failed").(string))
t.changeStatus(db, common.If(t.Status == "submitted", "succeed", "failed").(string))
}

View File

@ -31,7 +31,7 @@ func MsgFireRequest() {
Add(Busi+"/TransIn", req)
err := msg.Prepare(Busi + "/TransQuery")
e2p(err)
logrus.Printf("busi trans commit")
err = msg.Commit()
logrus.Printf("busi trans submit")
err = msg.Submit()
e2p(err)
}

View File

@ -31,8 +31,8 @@ func SagaFireRequest() {
saga := dtm.SagaNew(DtmServer).
Add(Busi+"/TransOut", Busi+"/TransOutRevert", req).
Add(Busi+"/TransIn", Busi+"/TransInRevert", req)
logrus.Printf("saga busi trans commit")
err := saga.Commit()
logrus.Printf("saga busi trans submit")
err := saga.Submit()
logrus.Printf("result gid is: %s", saga.Gid)
e2p(err)
}

View File

@ -40,8 +40,8 @@ func SagaBarrierFireRequest() {
saga := dtm.SagaNew(DtmServer).
Add(SagaBarrierBusi+"/TransOut", SagaBarrierBusi+"/TransOutCompensate", req).
Add(SagaBarrierBusi+"/TransIn", SagaBarrierBusi+"/TransInCompensate", req)
logrus.Printf("busi trans commit")
err := saga.Commit()
logrus.Printf("busi trans submit")
err := saga.Submit()
e2p(err)
}

View File

@ -31,7 +31,7 @@ func TccFireRequest() {
tcc := dtm.TccNew(DtmServer).
Add(Busi+"/TransOut", Busi+"/TransOutConfirm", Busi+"/TransOutRevert", req).
Add(Busi+"/TransIn", Busi+"/TransInConfirm", Busi+"/TransOutRevert", req)
logrus.Printf("tcc trans commit")
err := tcc.Commit()
logrus.Printf("tcc trans submit")
err := tcc.Submit()
e2p(err)
}

View File

@ -34,7 +34,7 @@ func qsFireRequest() {
saga := dtm.SagaNew(DtmServer).
Add(qsBusi+"/TransOut", qsBusi+"/TransOutCompensate", req).
Add(qsBusi+"/TransIn", qsBusi+"/TransInCompensate", req)
err := saga.Commit()
err := saga.Submit()
e2p(err)
}

View File

@ -42,14 +42,14 @@ func (s *Msg) Add(action string, postData interface{}) *Msg {
return s
}
func (s *Msg) Commit() error {
func (s *Msg) Submit() error {
logrus.Printf("committing %s body: %v", s.Gid, &s.MsgData)
resp, err := common.RestyClient.R().SetBody(&s.MsgData).Post(fmt.Sprintf("%s/commit", s.Server))
resp, err := common.RestyClient.R().SetBody(&s.MsgData).Post(fmt.Sprintf("%s/submit", s.Server))
if err != nil {
return err
}
if resp.StatusCode() != 200 {
return fmt.Errorf("commit failed: %v", resp.Body())
return fmt.Errorf("submit failed: %v", resp.Body())
}
s.Gid = jsonitor.Get(resp.Body(), "gid").ToString()
return nil

View File

@ -43,14 +43,14 @@ func (s *Saga) Add(action string, compensate string, postData interface{}) *Saga
return s
}
func (s *Saga) Commit() error {
func (s *Saga) Submit() error {
logrus.Printf("committing %s body: %v", s.Gid, &s.SagaData)
resp, err := common.RestyClient.R().SetBody(&s.SagaData).Post(fmt.Sprintf("%s/commit", s.Server))
resp, err := common.RestyClient.R().SetBody(&s.SagaData).Post(fmt.Sprintf("%s/submit", s.Server))
if err != nil {
return err
}
if resp.StatusCode() != 200 {
return fmt.Errorf("commit failed: %v", resp.Body())
return fmt.Errorf("submit failed: %v", resp.Body())
}
s.Gid = jsonitor.Get(resp.Body(), "gid").ToString()
return nil

6
tcc.go
View File

@ -45,14 +45,14 @@ func (s *Tcc) Add(try string, confirm string, cancel string, data interface{}) *
return s
}
func (s *Tcc) Commit() error {
func (s *Tcc) Submit() error {
logrus.Printf("committing %s body: %v", s.Gid, &s.TccData)
resp, err := common.RestyClient.R().SetBody(&s.TccData).Post(fmt.Sprintf("%s/commit", s.Server))
resp, err := common.RestyClient.R().SetBody(&s.TccData).Post(fmt.Sprintf("%s/submit", s.Server))
if err != nil {
return err
}
if resp.StatusCode() != 200 {
return fmt.Errorf("commit failed: %v", resp.Body())
return fmt.Errorf("submit failed: %v", resp.Body())
}
s.Gid = jsonitor.Get(resp.Body(), "gid").ToString()
return nil

4
xa.go
View File

@ -83,7 +83,7 @@ func (xa *XaClient) XaGlobalTransaction(gid string, transFunc XaGlobalFunc) (rer
defer func() {
x := recover()
if x != nil {
_, _ = common.RestyClient.R().SetBody(data).Post(xa.Server + "/rollback")
_, _ = common.RestyClient.R().SetBody(data).Post(xa.Server + "/abort")
rerr = x.(error)
}
}()
@ -94,7 +94,7 @@ func (xa *XaClient) XaGlobalTransaction(gid string, transFunc XaGlobalFunc) (rer
}
err = transFunc()
e2p(err)
resp, err = common.RestyClient.R().SetBody(data).Post(xa.Server + "/commit")
resp, err = common.RestyClient.R().SetBody(data).Post(xa.Server + "/submit")
e2p(err)
if !strings.Contains(resp.String(), "SUCCESS") {
panic(fmt.Errorf("unexpected result: %s", resp.String()))