如何保证每个循环体是单独事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Component
public 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);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@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();
}
}
}
0%