独立事务
Java的循环遍历,如何保证每个循环体都是单独的事务
- package demo;
-
- import org.apache.log4j.Logger;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Component;
-
- import java.util.List;
-
- @Component
- public class OrderTimer {
-
- private static Logger logger = Logger.getLogger(OrderTimer.class);
-
- @Autowired
- private OrderService orderService;
-
- @Autowired
- private OrderMapper orderMapper;
-
- /**
- * 每隔1分钟执行未付款订单的关闭的操作
- */
- @Scheduled(cron = "0 0/1 * * * ?")
- public void closeOrders() {
- logger.info("--------开始每隔1分钟执行未付款订单的关闭的操作");
-
- //获取所有超时未付款的订单,这个需要根据你自己的实际情况编写,此处只是举例
- List<Order> list= orderMapper.listCloseOrder();
- if(list==null||list.size()<1){
- return ;
- }
-
- for (Order order : list) {
- orderService.closeOrder(order);
- }
- }
-
- }
下面这个是实现层的代码,重点留意两个“关注点”:
- package demo;
-
- import org.apache.commons.lang.StringUtils;
- import org.apache.log4j.Logger;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Propagation;
- import org.springframework.transaction.annotation.Transactional;
- import org.springframework.transaction.interceptor.TransactionAspectSupport;
-
- @Service
- public class OrderServiceImpl implements OrderService {
-
- private static Logger logger=Logger.getLogger(OrderServiceImpl.class);
-
- @Autowired
- private OrderMapper orderMapper;
-
- /**
- 这个注解很重要,意思是设置当前方法的事务传播级别为REQUIRES_NEW,表示当前方法内的所有事务都是独立的,不影响整体的事务。
- 有的项目使用注解的方式配置当前方法传播属性会无效,此时可能需要你去你的spring-mybatis.xml文件中配置,效果是一样的
- */
- @Transactional(propagation = Propagation.REQUIRES_NEW)//关注点一!!!
- @Override
- public void closeOrder(Order order) {
-
- try{
-
- //这里,执行你自己的业务,比如商品库存回退,订单状态改变,操作流水等。
- //重点关注的是@Transactional注解和TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
-
-
-
- }catch (Exception e){
- logger.info("网络异常:"+e.getMessage());
-
- //这一段表示手动回滚事务,此处的try-catch,是表示当前方法如果出错了,
- //那我就自己消化这个异常,不再往外抛,处理异常的方式是手动回滚事务。
- //如此,每个循环体都自己处理自己的事务,不管成功与失败,都不影响整个循环
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//关注点二!!!
- }
-
- }
-
-
- }
大致的逻辑便是如此,这种东西无法分享具体的代码,因为涉及到事务就得有数据库操作,有数据库操作就得建库建表,不可能全部写出来,那样不管对写的人还是看的人都很难受,所以不如省略具体的核心业务,只关注几个需要关注的点,然后以你现有的项目为基础实现出来并亲自测试一下。当然,既然是伪代码,就需要有一定代码量的人才能脑补啊。
至此,分享结束,希望能帮到诸位!