一、一般编程式事务管理
1.开启事务
2.执行dao处理
3.提交或回滚事务
二、spring声明式事务管理,好处代码清晰,重复少
1.开启注解(两种方法)
1)@EnableTransactionManagement
2) xml配置开启
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
2.@Transactional 注解添加到需要的方法和类上面
3.注意@Transactional配置参数
org.springframework.transaction.annotation.Transactional包看源码,默认值
Propagation.REQUIRED
Isolation.DEFAULT
三、理解@Transactional过程
aop,代理对象会在执行@Transactional注解的方法前开启事务,根据执行结果,代理对象会在方法后回滚或提交事务。
org.springframework : spring-tx包
Transactional注解在
org.springframework.transaction.annotation.Transactional
注解后置处理,扫描并处理Transactional注解的接口是
org.springframework.transaction.annotation.TransactionAnnotationParser
找到相应的实现类就是注解事务处理
四、注意
理解就是为了防止出现系统抛异常,事务没有回滚而出错
1.三种 propagation 不启动事务
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
TransactionDefinition.PROPAGATION_SUPPORTS
TransactionDefinition.PROPAGATION_NEVER
2.不是所有异常都会回滚
rollbackFor=异常类(非继承自 RuntimeException 的异常)(spring默认RuntimeException会使事务回滚)
3.@Transactional只能用在public方法
一般都是注解在控制器直接调用的service层的public方法上
4.未被@Transactional注解的方法调用被@Transactional注解的方法,事务无效,spring AOP
理解:就是Transactional注解的事务是由spring来帮你开启事务的,但是spring是使用aop调用你的方法
method.invoke
如果你的方法内部调用了带有Transactional注解的方法,spring不知道,所有就没有开启事务