package main import ( "database/sql" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "log" "net/http" ) var DB *sql.DB func init() { db, err := sql.Open("mysql", "root:mashibing@tcp(192.168.177.131:3306)/tcc?charset=utf8mb4&parseTime=True&loc=Local") if err != nil { log.Fatalln(err) } DB = db } type Req struct { Quantity int `json:"quantity"` Id int `json:"id"` TxId string `json:"tx_id"` } func main() { r := gin.Default() r.POST("/order-create-try", func(c *gin.Context) { req := &Req{} if err := c.BindJSON(req); err != nil { log.Fatalln(err) } // 完成业务逻辑校验 // 本例中不需要校验,在库存服务检测库存即可 // 我们选择,先生成订单记录,订单状态为等待确认。若分布式事务校验通过,则更新订单状态为已确认,同时创建订单和商品关联记录,否则更新订单状态为未确认。 query := "insert into orders values (null, ?, 'confirming', 1024)" if _, err := DB.Exec(query, req.TxId); err != nil { c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"}) return } c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"}) }) r.POST("/order-create-confirm", func(c *gin.Context) { // 确认,生成订单信息,插入 orders 和 order_products 表记录,本例中,仅使用 order_products 表 req := &Req{} if err := c.BindJSON(req); err != nil { log.Fatalln(err) } orderId := 0 query := "select id from orders where tx_id=?" if err := DB.QueryRow(query, req.TxId).Scan(&orderId); err != nil { log.Fatalln(err) } query = "update orders set status='confirmed' where id=?" if _, err := DB.Exec(query, orderId); err != nil { c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"}) return } query = "insert into order_products values (?, ?, ?, 99)" if _, err := DB.Exec(query, orderId, req.Id, req.Quantity); err != nil { c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"}) return } c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"}) }) r.POST("/order-create-cancel", func(c *gin.Context) { // 取消,更新订单状态未确认 not confirmed req := &Req{} if err := c.BindJSON(req); err != nil { log.Fatalln(err) } query := "update orders set status='not confirmed' where tx_id=?" if _, err := DB.Exec(query, req.TxId); err != nil { c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"}) return } c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"}) }) r.Run(":8081") }