Spring声明事务的两种方式
方式一、传统的编程式事务管理:
需要手动编写代码在业务层注入事务管理模板(一般不用)
方式二、基于 AOP 技术实现的声明式事务管理:
Spring 声明式事务管理在底层采用了 AOP 技术,其最大的优点在于无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。
- 基于 XML 方式的声明式事务管理。
- 通过 @Transactional 注解方式的事务管理。
Spring事务异常处理机制
RuntimeException()和Exception()区别:
1.继承自RuntimeException或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。
Spring事务默认只在发生未被捕获的RuntimeException()时才进行回滚。
Spring通过SpringAOP进行声明式事务管理:
SpringAOP异常捕获的原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下SpringAOP只捕获RuntimeException的异常,因此不是RuntimeException或其子类的异常不能够捕获,默认情况下不进行回滚,但可以通过配置来捕获特定的异常并回滚 。
因此:
方法1:在service层不使用try......catch或者在catch中最后加上throw new RuntimeException(),这样程序异常时aop才可以捕获异常并进行回滚。
最终在service上层(如controller层、action层、view层)要继续捕获这个异常并处理。
方法2:在service层方法上进行配置,改变默认规则,方法如下 :