简洁明了的概述
spring 事务
(1)编程式事务管理
(2)声明式事务管理
由于使用声明式事务比较简单,它是在spring AOP的基础上实现,本质就是使用@Transaction注解,放在方法,类等上,放在类上就说明此类下的所有public方法都开启事务,放在方法上就是方法前开启事务,方法结束时来判断事务是否提交获取回滚。
但是要注意的就是事务是否回滚条件:
1、对于mysql的MyISAMy引擎,是不支持事务的。
2、默认spring事务只在发生未被捕获的 RuntimeException 时才回滚。换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚。
3、Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,因此对于我们自定义异常,通过rollbackFor进行设定,后续会单独讲
@Transactional(rollbackForClassName={"Exception"})
或者
@Transactional(rollbackFor={Exception.class})
二、你遇到异常不想回滚事务的时候,同样的你也可指定不回滚的规则,下面的一个例子告诉你,即使遇到未处理的 InstrumentNotFoundException
异常时,Spring FrameWork 的事务框架同样会提交事务,而不回滚。
@Transactional(noRollbackForClassName={"InstrumentNotFoundException"})
或者
@Transactional(noRollbackFor={InstrumentNotFoundException.class})