Test之前准备好的环境

Nacos、Seata的启动

服务的启动

image.png

1、下订单->减库存->扣余额->改(订单)状态

2、数据库初始情况

image.png
image.png
image.png

3、正常下单

image.png

4、超时异常,没加@GlobalTransactional

AccountServiceImpl添加超时

数据库情况

故障情况:
当库存和账户余额扣减后,订单状态并没有设置为已经完成,没有从0改为1
而且由于feign的重试机制,账户余额可能会再次被多次扣除
image.png

5、超时异常,添加@GlobalTransactional

AccountServiceImpl添加超时
OrderServiceImpl @GlobalTransactional
下单后数据库数据没有发生改变
image.png

  1. /**
  2. * The interface Global transactional.
  3. */
  4. @Retention(RetentionPolicy.RUNTIME)
  5. @Target(ElementType.METHOD)
  6. @Inherited
  7. public @interface GlobalTransactional {
  8. /**
  9. * Global transaction timeoutMills in MILLISECONDS.
  10. *
  11. * @return timeoutMills in MILLISECONDS.
  12. */
  13. int timeoutMills() default TransactionInfo.DEFAULT_TIME_OUT;
  14. /**
  15. * Given name of the global transaction instance.
  16. *
  17. * @return Given name.
  18. */
  19. String name() default "";
  20. /**
  21. * roll back for the Class
  22. * @return
  23. */
  24. Class<? extends Throwable>[] rollbackFor() default {}; 哪些事务是一定要回滚的
  25. /**
  26. * roll back for the class name
  27. * @return
  28. */
  29. String[] rollbackForClassName() default {};
  30. /**
  31. * not roll back for the Class
  32. * @return
  33. */
  34. Class<? extends Throwable>[] noRollbackFor() default {};
  35. /**
  36. * not roll back for the class name
  37. * @return
  38. */
  39. String[] noRollbackForClassName() default {}; 哪些事务是不需要回滚的
  40. }

image.png