Java - TransactionTemplate 使用

2024年03月20日 16:51 · 阅读(737) ·

扩展

收款平台-@Transactional 失效问题

公共类-AssertUtil

  1. import cn.hutool.core.util.StrUtil;
  2. import com.luoma.finance.excepiton.InternalApiException;
  3. /**
  4. *
  5. * 断言工具类
  6. */
  7. public class AssertUtil {
  8. /**
  9. * 断言
  10. * @param flag 断言标识
  11. * @param code 异常码
  12. * @param message
  13. * 异常信息,
  14. * 如果异常信息需要多语言统一{@link com.luoma.finance.handler.GlobalExceptionHandler}中做多语言处理,
  15. * 以message 作为key去获取多语言信息,
  16. * 如果需要支持带动态参数的多语言需要拓展 {@link com.luoma.finance.excepiton.InternalApiException}
  17. * @param messageParam 异常信息参数
  18. */
  19. public static void isTrue(boolean flag,int code,String message,Object... messageParam){
  20. if(!flag){
  21. throw new InternalApiException(code, StrUtil.format(message,messageParam));
  22. }
  23. }
  24. }

第一种情况,入口没有加 @Transactional,TransactionTemplate 里面报错

  1. @Resource
  2. IPaymentWalletAccountService accountService;
  3. @Resource
  4. private TransactionTemplate transactionTemplate;
  5. @GetMapping("/testPaymentWalletAccount")
  6. public PaymentWalletAccount testPaymentWalletAccount() {
  7. PaymentWalletAccount dto = new PaymentWalletAccount();
  8. dto.setSourceSystem("FPP");
  9. dto.setSourceNum("FPP1");
  10. dto.setReferenceId("FPP1");
  11. dto.setRechargeOrderNumber("1");
  12. dto.setPayOrderNumber("1");
  13. dto.setOrgCode("101");
  14. dto.setOrgName("OU_101");
  15. dto.setPayCurrencyCode("CNY");
  16. dto.setPayAmount(new BigDecimal("2.22"));
  17. dto.setIsReconciliation("Y");
  18. dto.setReconciliationStatus("FAILED");
  19. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  20. dto.setActualPayMonth("202403");
  21. dto.setPayMonth("202404");
  22. int count = accountService.getBaseMapper().insert(dto);
  23. String methodName = "testPaymentWalletAccount() >> ";
  24. log.info(methodName + "count:{}", count);
  25. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  26. @Override
  27. protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
  28. PaymentWalletAccount dto = new PaymentWalletAccount();
  29. dto.setSourceSystem("FPP");
  30. dto.setSourceNum("FPP");
  31. dto.setReferenceId(UUID.randomUUID().toString());
  32. dto.setRechargeOrderNumber("1");
  33. dto.setPayOrderNumber("1");
  34. dto.setOrgCode("101");
  35. dto.setOrgName("OU_101");
  36. dto.setPayCurrencyCode("CNY");
  37. dto.setPayAmount(new BigDecimal("2.22"));
  38. dto.setIsReconciliation("Y");
  39. dto.setReconciliationStatus("FAILED");
  40. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  41. dto.setActualPayMonth("202403");
  42. dto.setPayMonth("202404");
  43. int count = accountService.getBaseMapper().insert(dto);
  44. String methodName = "testPaymentWalletAccount() >> ";
  45. log.info(methodName + "count:{}", count);
  46. //故意设置失败
  47. count = 0;
  48. AssertUtil.isTrue(count > 0, ResponseCode.UNKNOWN_EXCEPTION.value(),"insert 数据失败");
  49. }
  50. });
  51. return dto;
  52. }
  • 调用接口,查询数据库,添加了外层的数据

第二种情况,入口加 @Transactional,TransactionTemplate 里面报错

  1. @Resource
  2. IPaymentWalletAccountService accountService;
  3. @Resource
  4. private TransactionTemplate transactionTemplate;
  5. @GetMapping("/testPaymentWalletAccount")
  6. @Transactional(rollbackFor = Exception.class)
  7. public PaymentWalletAccount testPaymentWalletAccount() {
  8. PaymentWalletAccount dto = new PaymentWalletAccount();
  9. dto.setSourceSystem("FPP");
  10. dto.setSourceNum("FPP1");
  11. dto.setReferenceId("FPP1");
  12. dto.setRechargeOrderNumber("1");
  13. dto.setPayOrderNumber("1");
  14. dto.setOrgCode("101");
  15. dto.setOrgName("OU_101");
  16. dto.setPayCurrencyCode("CNY");
  17. dto.setPayAmount(new BigDecimal("2.22"));
  18. dto.setIsReconciliation("Y");
  19. dto.setReconciliationStatus("FAILED");
  20. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  21. dto.setActualPayMonth("202403");
  22. dto.setPayMonth("202404");
  23. int count = accountService.getBaseMapper().insert(dto);
  24. String methodName = "testPaymentWalletAccount() >> ";
  25. log.info(methodName + "count:{}", count);
  26. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  27. @Override
  28. protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
  29. PaymentWalletAccount dto = new PaymentWalletAccount();
  30. dto.setSourceSystem("FPP");
  31. dto.setSourceNum("FPP");
  32. dto.setReferenceId(UUID.randomUUID().toString());
  33. dto.setRechargeOrderNumber("1");
  34. dto.setPayOrderNumber("1");
  35. dto.setOrgCode("101");
  36. dto.setOrgName("OU_101");
  37. dto.setPayCurrencyCode("CNY");
  38. dto.setPayAmount(new BigDecimal("2.22"));
  39. dto.setIsReconciliation("Y");
  40. dto.setReconciliationStatus("FAILED");
  41. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  42. dto.setActualPayMonth("202403");
  43. dto.setPayMonth("202404");
  44. int count = accountService.getBaseMapper().insert(dto);
  45. String methodName = "testPaymentWalletAccount() >> ";
  46. log.info(methodName + "count:{}", count);
  47. //故意设置失败
  48. count = 0;
  49. AssertUtil.isTrue(count > 0, ResponseCode.UNKNOWN_EXCEPTION.value(),"insert 数据失败");
  50. }
  51. });
  52. return dto;
  53. }
  • 调用接口,查询数据库,无数据

第三种情况,入口加 @Transactional,外面报错

  1. @Resource
  2. IPaymentWalletAccountService accountService;
  3. @Resource
  4. private TransactionTemplate transactionTemplate;
  5. @GetMapping("/testPaymentWalletAccount")
  6. @Transactional(rollbackFor = Exception.class)
  7. public PaymentWalletAccount testPaymentWalletAccount() {
  8. PaymentWalletAccount dto = new PaymentWalletAccount();
  9. dto.setSourceSystem("FPP");
  10. dto.setSourceNum("FPP1");
  11. dto.setReferenceId("FPP1");
  12. dto.setRechargeOrderNumber("1");
  13. dto.setPayOrderNumber("1");
  14. dto.setOrgCode("101");
  15. dto.setOrgName("OU_101");
  16. dto.setPayCurrencyCode("CNY");
  17. dto.setPayAmount(new BigDecimal("2.22"));
  18. dto.setIsReconciliation("Y");
  19. dto.setReconciliationStatus("FAILED");
  20. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  21. dto.setActualPayMonth("202403");
  22. dto.setPayMonth("202404");
  23. int count = accountService.getBaseMapper().insert(dto);
  24. String methodName = "testPaymentWalletAccount() >> ";
  25. log.info(methodName + "count:{}", count);
  26. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  27. @Override
  28. protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
  29. PaymentWalletAccount dto = new PaymentWalletAccount();
  30. dto.setSourceSystem("FPP");
  31. dto.setSourceNum("FPP");
  32. dto.setReferenceId(UUID.randomUUID().toString());
  33. dto.setRechargeOrderNumber("1");
  34. dto.setPayOrderNumber("1");
  35. dto.setOrgCode("101");
  36. dto.setOrgName("OU_101");
  37. dto.setPayCurrencyCode("CNY");
  38. dto.setPayAmount(new BigDecimal("2.22"));
  39. dto.setIsReconciliation("Y");
  40. dto.setReconciliationStatus("FAILED");
  41. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  42. dto.setActualPayMonth("202403");
  43. dto.setPayMonth("202404");
  44. int count = accountService.getBaseMapper().insert(dto);
  45. String methodName = "testPaymentWalletAccount() >> ";
  46. log.info(methodName + "count:{}", count);
  47. //故意设置失败
  48. //count = 0;
  49. AssertUtil.isTrue(count > 0, ResponseCode.UNKNOWN_EXCEPTION.value(),"insert 数据失败");
  50. }
  51. });
  52. AssertUtil.isTrue(false, ResponseCode.UNKNOWN_EXCEPTION.value(),"故意抛出异常");
  53. return dto;
  54. }
  • 调用接口,查询数据库,无数据

第四种情况,入口不加 @Transactional,外面报错

  1. @Resource
  2. IPaymentWalletAccountService accountService;
  3. @Resource
  4. private TransactionTemplate transactionTemplate;
  5. @GetMapping("/testPaymentWalletAccount")
  6. public PaymentWalletAccount testPaymentWalletAccount() {
  7. PaymentWalletAccount dto = new PaymentWalletAccount();
  8. dto.setSourceSystem("FPP");
  9. dto.setSourceNum("FPP1");
  10. dto.setReferenceId("FPP1");
  11. dto.setRechargeOrderNumber("1");
  12. dto.setPayOrderNumber("1");
  13. dto.setOrgCode("101");
  14. dto.setOrgName("OU_101");
  15. dto.setPayCurrencyCode("CNY");
  16. dto.setPayAmount(new BigDecimal("2.22"));
  17. dto.setIsReconciliation("Y");
  18. dto.setReconciliationStatus("FAILED");
  19. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  20. dto.setActualPayMonth("202403");
  21. dto.setPayMonth("202404");
  22. int count = accountService.getBaseMapper().insert(dto);
  23. String methodName = "testPaymentWalletAccount() >> ";
  24. log.info(methodName + "count:{}", count);
  25. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  26. @Override
  27. protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
  28. PaymentWalletAccount dto = new PaymentWalletAccount();
  29. dto.setSourceSystem("FPP");
  30. dto.setSourceNum("FPP");
  31. dto.setReferenceId(UUID.randomUUID().toString());
  32. dto.setRechargeOrderNumber("1");
  33. dto.setPayOrderNumber("1");
  34. dto.setOrgCode("101");
  35. dto.setOrgName("OU_101");
  36. dto.setPayCurrencyCode("CNY");
  37. dto.setPayAmount(new BigDecimal("2.22"));
  38. dto.setIsReconciliation("Y");
  39. dto.setReconciliationStatus("FAILED");
  40. dto.setActualPayDate(CommonUtil.getDataStr(LocalDateTime.now(), null));
  41. dto.setActualPayMonth("202403");
  42. dto.setPayMonth("202404");
  43. int count = accountService.getBaseMapper().insert(dto);
  44. String methodName = "testPaymentWalletAccount() >> ";
  45. log.info(methodName + "count:{}", count);
  46. //故意设置失败
  47. //count = 0;
  48. AssertUtil.isTrue(count > 0, ResponseCode.UNKNOWN_EXCEPTION.value(),"insert 数据失败");
  49. }
  50. });
  51. AssertUtil.isTrue(false, ResponseCode.UNKNOWN_EXCEPTION.value(),"故意抛出异常");
  52. return dto;
  53. }
  • 调用接口,查询数据库,有两条数据,外部错误不影响 transactionTemplate 内部事务