1、背景:定时器定时从数据库中拉取数据进行分组处理,每一组如果有任意一个异常导致失败,该组操作事务只能回滚。所以在循环中每一次大循环是一个事务,大循环中的其它小循环中任意一个异常都会回滚处理。
2、service中引入spring的事务管理器
@Autowired
private DataSourceTransactionManager transactionManager;
3、在事务开始的地方:
DefaultTransactionDefinition transDefinition = new DefaultTransactionDefinition();
transDefinition.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = transactionManager.getTransaction(transDefinition);
4、在事务回滚的地方添加:
transactionManager.rollback(status);
5、在事务提交的地方:
transactionManager.commit(status);
注意:即使没有进行任何处理也没有异常,continue跳出当前循环,必须要回滚事务,这个坑我验证过,自以为没有进行数据库任何增删改操作不需要回滚,结果导致数据库连接不能释放导致数据库链接耗尽,血泪教训呀!!!!!!