独立事务

Java的循环遍历,如何保证每个循环体都是单独的事务

  1. package demo;
  2. import org.apache.log4j.Logger;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.scheduling.annotation.Scheduled;
  5. import org.springframework.stereotype.Component;
  6. import java.util.List;
  7. @Component
  8. public class OrderTimer {
  9. private static Logger logger = Logger.getLogger(OrderTimer.class);
  10. @Autowired
  11. private OrderService orderService;
  12. @Autowired
  13. private OrderMapper orderMapper;
  14. /**
  15. * 每隔1分钟执行未付款订单的关闭的操作
  16. */
  17. @Scheduled(cron = "0 0/1 * * * ?")
  18. public void closeOrders() {
  19. logger.info("--------开始每隔1分钟执行未付款订单的关闭的操作");
  20. //获取所有超时未付款的订单,这个需要根据你自己的实际情况编写,此处只是举例
  21. List<Order> list= orderMapper.listCloseOrder();
  22. if(list==null||list.size()<1){
  23. return ;
  24. }
  25. for (Order order : list) {
  26. orderService.closeOrder(order);
  27. }
  28. }
  29. }

 

下面这个是实现层的代码,重点留意两个“关注点”:

  1. package demo;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.apache.log4j.Logger;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.transaction.annotation.Propagation;
  7. import org.springframework.transaction.annotation.Transactional;
  8. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  9. @Service
  10. public class OrderServiceImpl implements OrderService {
  11. private static Logger logger=Logger.getLogger(OrderServiceImpl.class);
  12. @Autowired
  13. private OrderMapper orderMapper;
  14. /**
  15. 这个注解很重要,意思是设置当前方法的事务传播级别为REQUIRES_NEW,表示当前方法内的所有事务都是独立的,不影响整体的事务。
  16. 有的项目使用注解的方式配置当前方法传播属性会无效,此时可能需要你去你的spring-mybatis.xml文件中配置,效果是一样的
  17. */
  18. @Transactional(propagation = Propagation.REQUIRES_NEW)//关注点一!!!
  19. @Override
  20. public void closeOrder(Order order) {
  21. try{
  22. //这里,执行你自己的业务,比如商品库存回退,订单状态改变,操作流水等。
  23. //重点关注的是@Transactional注解和TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
  24. }catch (Exception e){
  25. logger.info("网络异常:"+e.getMessage());
  26. //这一段表示手动回滚事务,此处的try-catch,是表示当前方法如果出错了,
  27. //那我就自己消化这个异常,不再往外抛,处理异常的方式是手动回滚事务。
  28. //如此,每个循环体都自己处理自己的事务,不管成功与失败,都不影响整个循环
  29. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//关注点二!!!
  30. }
  31. }
  32. }

 

       大致的逻辑便是如此,这种东西无法分享具体的代码,因为涉及到事务就得有数据库操作,有数据库操作就得建库建表,不可能全部写出来,那样不管对写的人还是看的人都很难受,所以不如省略具体的核心业务,只关注几个需要关注的点,然后以你现有的项目为基础实现出来并亲自测试一下。当然,既然是伪代码,就需要有一定代码量的人才能脑补啊。

       至此,分享结束,希望能帮到诸位!

 

posted @ 2020-11-14 21:20  DiligentCoder  阅读(673)  评论(0编辑  收藏  举报