1.第一种写法:
手动设置回滚点
@Transactional(rollbackFor = Exception.class)
public void check() {
for (Item item : List) {
//设置回滚点
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
try {
//核对
check(item)
//保存核对信息
saveCheckInfo(item);
} catch (Exception e) {
//回滚当前事务
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
}
}
}
2.第二种写法
这个注解很重要,意思是设置当前方法的事务传播级别为REQUIRES_NEW,表示当前方法内的所有事务都是独立的,不影响整体的事务。 有的项目使用注解的方式配置当前方法传播属性会无效,此时可能需要你去你的spring-mybatis.xml文件中配置,效果是一样的。
@Transactional(propagation = Propagation.REQUIRES_NEW)//关注点一!!!
public void closeOrder() {
try{
//这里,执行你自己的业务,比如商品库存回退,订单状态改变,操作流水等。
//重点关注的是@Transactional注解和TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
}catch (Exception e){
//这一段表示手动回滚事务,此处的try-catch,是表示当前方法如果出错了,
//那我就自己消化这个异常,不再往外抛,处理异常的方式是手动回滚事务。
//如此,每个循环体都自己处理自己的事务,不管成功与失败,都不影响整个循环
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//关注点二!!!
}
}