zoukankan      html  css  js  c++  java
  • 独立事务

    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. }

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

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

  • 相关阅读:
    Gibbs Sampling深入理解
    MCMC算法深入理解
    蒙特卡洛法
    马尔科夫链及其平稳状态
    Dirichlet分布深入理解
    xmldecoder漏洞
    基于BindingSource的WinForm开发
    .net WinForm 的数据绑定
    C#获取网页的HTML码、下载网站图片
    4步win7下简单FTP服务器搭建(试验成功)
  • 原文地址:https://www.cnblogs.com/LoveShare/p/13974773.html
Copyright © 2011-2022 走看看