1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| package main
import ( "context" "database/sql" "fmt" "github.com/gin-gonic/gin" "github.com/seata/seata-go-samples/util" "github.com/seata/seata-go/pkg/client" ginmiddleware "github.com/seata/seata-go/pkg/integration/gin" "github.com/seata/seata-go/pkg/util/log" "net/http" )
var db *sql.DB
func main() { client.InitPath("../../../conf/seatago.yml") //TODO 这里是不同模式 // db = util.GetXAMySqlDb() //xa db = util.GetAtMySqlDb() //at r := gin.Default() r.Use(ginmiddleware.TransactionMiddleware()) r.POST("/updateDataSuccess", updateDataSuccessHandler) if err := r.Run(":8080"); err != nil { log.Fatalf("start tcc server fatal: %v", err) } }
func updateDataSuccessHandler(c *gin.Context) { log.Infof("get tm updateData") if err := updateDataSuccess(c); err != nil { c.JSON(http.StatusBadRequest, "updateData failure") return } if err := updateDataSuccess2(c); err != nil { c.JSON(http.StatusBadRequest, "updateData2 failure") return } //c.JSON(http.StatusOK, "updateData ok") //成功 c.JSON(http.StatusBadRequest, "updateData failure") //TODO 测试fail,回滚 }
func updateDataSuccess(ctx context.Context) error { sql := "update order_tbl set count=? where id=?" ret, err := db.ExecContext(ctx, sql, 10, 1) if err != nil { fmt.Printf("update failed, err:%v\n", err) return nil }
rows, err := ret.RowsAffected() if err != nil { fmt.Printf("update failed, err:%v\n", err) return nil } fmt.Printf("更新成功 success: %d.\n", rows) return nil }
func updateDataSuccess2(ctx context.Context) error { sql := "update order_tbl set count=? where id=?" ret, err := db.ExecContext(ctx, sql, 101, 1) if err != nil { fmt.Printf("update failed, err:%v\n", err) return nil }
rows, err := ret.RowsAffected() if err != nil { fmt.Printf("update failed, err:%v\n", err) return nil } fmt.Printf("更新成功 success: %d.\n", rows) return nil }
|