|
|
|
@ -3,7 +3,6 @@ package examples |
|
|
|
import ( |
|
|
|
"database/sql" |
|
|
|
"fmt" |
|
|
|
"time" |
|
|
|
|
|
|
|
"github.com/gin-gonic/gin" |
|
|
|
"github.com/sirupsen/logrus" |
|
|
|
@ -11,35 +10,17 @@ import ( |
|
|
|
"github.com/yedf/dtm/dtmcli" |
|
|
|
) |
|
|
|
|
|
|
|
// 事务参与者的服务地址
|
|
|
|
const TccBarrierBusiApi = "/api/busi_saga_barrier" |
|
|
|
|
|
|
|
var TccBarrierBusi = fmt.Sprintf("http://localhost:%d%s", TccBarrierBusiPort, TccBarrierBusiApi) |
|
|
|
|
|
|
|
func TccBarrierMainStart() { |
|
|
|
TccBarrierStartSvr() |
|
|
|
TccBarrierFireRequest() |
|
|
|
} |
|
|
|
|
|
|
|
func TccBarrierStartSvr() { |
|
|
|
logrus.Printf("saga barrier examples starting") |
|
|
|
app := common.GetGinApp() |
|
|
|
TccBarrierAddRoute(app) |
|
|
|
go app.Run(fmt.Sprintf(":%d", TccBarrierBusiPort)) |
|
|
|
time.Sleep(100 * time.Millisecond) |
|
|
|
} |
|
|
|
|
|
|
|
func TccBarrierFireRequest() { |
|
|
|
logrus.Printf("tcc transaction begin") |
|
|
|
_, err := dtmcli.TccGlobalTransaction(DtmServer, func(tcc *dtmcli.Tcc) (rerr error) { |
|
|
|
res1, rerr := tcc.CallBranch(&TransReq{Amount: 30}, TccBarrierBusi+"/TransOutTry", TccBarrierBusi+"/TransOutConfirm", TccBarrierBusi+"/TransOutRevert") |
|
|
|
res1, rerr := tcc.CallBranch(&TransReq{Amount: 30}, Busi+"/TccBTransOutTry", Busi+"/TccBTransOutConfirm", Busi+"/TccBTransOutRevert") |
|
|
|
if rerr != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
if res1.StatusCode() != 200 { |
|
|
|
return fmt.Errorf("bad status code: %d", res1.StatusCode()) |
|
|
|
} |
|
|
|
res2, rerr := tcc.CallBranch(&TransReq{Amount: 30}, TccBarrierBusi+"/TransInTry", TccBarrierBusi+"/TransInConfirm", TccBarrierBusi+"/TransInRevert") |
|
|
|
res2, rerr := tcc.CallBranch(&TransReq{Amount: 30}, Busi+"/TccBTransInTry", Busi+"/TccBTransInConfirm", Busi+"/TccBTransInRevert") |
|
|
|
if rerr != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
@ -55,13 +36,13 @@ func TccBarrierFireRequest() { |
|
|
|
// api
|
|
|
|
|
|
|
|
func TccBarrierAddRoute(app *gin.Engine) { |
|
|
|
app.POST(TccBarrierBusiApi+"/TransInTry", common.WrapHandler(tccBarrierTransInTry)) |
|
|
|
app.POST(TccBarrierBusiApi+"/TransInConfirm", common.WrapHandler(tccBarrierTransInConfirm)) |
|
|
|
app.POST(TccBarrierBusiApi+"/TransInCancel", common.WrapHandler(tccBarrierTransInCancel)) |
|
|
|
app.POST(TccBarrierBusiApi+"/TransOutTry", common.WrapHandler(tccBarrierTransOutTry)) |
|
|
|
app.POST(TccBarrierBusiApi+"/TransOutConfirm", common.WrapHandler(tccBarrierTransOutConfirm)) |
|
|
|
app.POST(TccBarrierBusiApi+"/TransOutCancel", common.WrapHandler(tccBarrierTransOutCancel)) |
|
|
|
logrus.Printf("examples listening at %d", TccBarrierBusiPort) |
|
|
|
app.POST(BusiApi+"/TccBTransInTry", common.WrapHandler(tccBarrierTransInTry)) |
|
|
|
app.POST(BusiApi+"/TccBTransInConfirm", common.WrapHandler(tccBarrierTransInConfirm)) |
|
|
|
app.POST(BusiApi+"/TccBTransInCancel", common.WrapHandler(tccBarrierTransInCancel)) |
|
|
|
app.POST(BusiApi+"/TccBTransOutTry", common.WrapHandler(tccBarrierTransOutTry)) |
|
|
|
app.POST(BusiApi+"/TccBTransOutConfirm", common.WrapHandler(tccBarrierTransOutConfirm)) |
|
|
|
app.POST(BusiApi+"/TccBTransOutCancel", common.WrapHandler(tccBarrierTransOutCancel)) |
|
|
|
logrus.Printf("examples listening at %d", BusiPort) |
|
|
|
} |
|
|
|
|
|
|
|
const transInUid = 1 |
|
|
|
@ -93,43 +74,37 @@ func adjustBalance(sdb *sql.DB, uid int, amount int) (interface{}, error) { |
|
|
|
|
|
|
|
// TCC下,转入
|
|
|
|
func tccBarrierTransInTry(c *gin.Context) (interface{}, error) { |
|
|
|
req := reqFrom(c) |
|
|
|
return dtmcli.ThroughBarrierCall(dbGet().ToSqlDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { |
|
|
|
return adjustTrading(sdb, transInUid, req.Amount) |
|
|
|
return adjustTrading(sdb, transInUid, reqFrom(c).Amount) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
func tccBarrierTransInConfirm(c *gin.Context) (interface{}, error) { |
|
|
|
req := reqFrom(c) |
|
|
|
return dtmcli.ThroughBarrierCall(dbGet().ToSqlDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { |
|
|
|
return adjustBalance(sdb, transInUid, req.Amount) |
|
|
|
return adjustBalance(sdb, transInUid, reqFrom(c).Amount) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
func tccBarrierTransInCancel(c *gin.Context) (interface{}, error) { |
|
|
|
req := reqFrom(c) |
|
|
|
return dtmcli.ThroughBarrierCall(dbGet().ToSqlDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { |
|
|
|
return adjustTrading(sdb, transInUid, -req.Amount) |
|
|
|
return adjustTrading(sdb, transInUid, -reqFrom(c).Amount) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
func tccBarrierTransOutTry(c *gin.Context) (interface{}, error) { |
|
|
|
req := reqFrom(c) |
|
|
|
return dtmcli.ThroughBarrierCall(dbGet().ToSqlDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { |
|
|
|
return adjustTrading(sdb, transOutUid, -req.Amount) |
|
|
|
return adjustTrading(sdb, transOutUid, -reqFrom(c).Amount) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
func tccBarrierTransOutConfirm(c *gin.Context) (interface{}, error) { |
|
|
|
req := reqFrom(c) |
|
|
|
return dtmcli.ThroughBarrierCall(dbGet().ToSqlDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { |
|
|
|
return adjustBalance(sdb, transOutUid, -req.Amount) |
|
|
|
return adjustBalance(sdb, transOutUid, -reqFrom(c).Amount) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
func tccBarrierTransOutCancel(c *gin.Context) (interface{}, error) { |
|
|
|
req := reqFrom(c) |
|
|
|
return dtmcli.ThroughBarrierCall(dbGet().ToSqlDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { |
|
|
|
return adjustTrading(sdb, transOutUid, req.Amount) |
|
|
|
return adjustTrading(sdb, transOutUid, reqFrom(c).Amount) |
|
|
|
}) |
|
|
|
} |
|
|
|
|