请求事务(TransactionScope)

目录结构

主目录transactions

  1. —— main.go

代码示例

main.go

  1. package main
  2. import (
  3. "github.com/kataras/iris"
  4. "github.com/kataras/iris/context"
  5. )
  6. func main() {
  7. app := iris.New()
  8. //子域可以与所有可用的路由器一起使用,就像其他功能一样。
  9. app.Get("/", func(ctx context.Context) {
  10. ctx.BeginTransaction(func(t *context.Transaction) {
  11. // 选择步骤:如果为true,那么下一个转录将不会被执行,如果为fails则向反
  12. // t.SetScope(context.RequestTransactionScope)
  13. //可选步骤:
  14. //在此处创建新的自定义错误类型,以跟踪状态代码和错误消息
  15. err := context.NewTransactionErrResult()
  16. //如果我们想要回滚这个函数clojure中的任何错误,我们应该使用t.Context。
  17. t.Context().Text("Blablabla this should not be sent to the client because we will fill the err with a message and status")
  18. //在这里虚拟化一个虚假的错误,为了测试这个例子
  19. fail := true
  20. if fail {
  21. err.StatusCode = iris.StatusInternalServerError
  22. //注意:如果为空原因则会触发默认或自定义http错误(如ctx.FireStatusCode)
  23. err.Reason = "Error: Virtual failure!!"
  24. //选择步骤:
  25. //但是如果我们想要在事务失败时将错误消息回发给客户端,这很有用
  26. //如果原因为空,那么交易成功完成,
  27. //否则我们回滚整个返回的响应体,
  28. //header和Cookie,状态代码以及此事务中的所有内容
  29. t.Complete(err)
  30. }
  31. })
  32. ctx.BeginTransaction(func(t *context.Transaction) {
  33. t.Context().HTML("<h1>This will sent at all cases because it lives on different transaction and it doesn't fails</h1>")
  34. // *如果我们没有任何'throw error'逻辑,则不需要scope.Complete()
  35. })
  36. // OPTIONALLY,取决于用法:
  37. //无论如何,在上下文的事务中发生的情景都会发送给客户端
  38. ctx.HTML("<h1>Let's add a second html message to the response, " +
  39. "if the transaction was failed and it was request scoped then this message would " +
  40. "not been shown. But it has a transient scope(default) so, it is visible as expected!</h1>")
  41. })
  42. app.Run(iris.Addr(":8080"))
  43. }

提示

  • 尝试修改一下fail变量值,当与到错误,则会不显示BeginTransaction里面的内容,也就是说回滚了