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:3307)/saga?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("/deduct", func(c *gin.Context) { // 解析请求数据 req := &Req{} if err := c.BindJSON(req); err != nil { log.Fatalln(err) } // 执行 扣减库存 query := "update storages set inventory = inventory-? where id = ?" if _, err := DB.Exec(query, req.Quantity, req.Id); err != nil { c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE", "message": "deduct inventory failed"}) return } // 判定库存是否为负数,负数失败 inventory := 0 query = "select inventory from storages where id=?" if err := DB.QueryRow(query, req.Id).Scan(&inventory); err != nil { log.Fatalln(err) } if inventory < 0 { c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE", "message": "inventory is not enough"}) return } c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"}) }) r.POST("/deduct-compensate", func(c *gin.Context) { req := &Req{} if err := c.BindJSON(req); err != nil { log.Fatalln(err) } // 执行 扣减库存的补偿操作 query := "update storages set inventory = inventory+? where id = ?" if _, err := DB.Exec(query, req.Quantity, req.Id); err != nil { c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE", "message": "compensate inventory failed"}) return } c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"}) }) r.Run(":8082") }