如何保证每个循环体是单独事务 发表于 2023-08-05 | 分类于 Spring | 本文总阅读量 次 1234567891011121314151617181920212223242526@Componentpublic class OrderTimer { @Autowired private OrderService orderService; @Autowired private OrderMapper orderMapper; /** * 每隔1分钟执行未付款订单的关闭的操作 */ @Scheduled(cron = "0 0/1 * * * ?") public void closeOrders() { //获取所有超时未付款的订单,这个需要根据你自己的实际情况编写,此处只是举例 List<Order> list= orderMapper.listCloseOrder(); if(list==null||list.size()<1){ return ; } for (Order order : list) { orderService.closeOrder(order); } }} 1234567891011121314151617181920212223242526272829303132@Servicepublic 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(); } }}