Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。也就是说,当抛出个RuntimeException 或其子类例的实例时。(Errors 也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚。
1)让checked例外也回滚:在整个方法前加上
@Transactional(rollbackFor=Exception.class)
2)让unchecked例外不回滚:
@Transactional(notRollbackFor=RunTimeException.class)
3)不需要事务管理的(只查询的)方法:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。
总结
Spring团队的建议是你在具体的类(