Spring 事务管理
Spring 事务管理,主要将事务由Dao层提升至Service层。
【1】平台事务管理器(PlatformTranscationManager)和 事务定义接口(TranscationDefinition)
【1.1】平台事务管理器(PlatformTranscationManager)
重要的三个方法(commit() rollback() getTransaction())
当发生运行时异常的时候回滚,受查异常的时候提交。
运行时异常需要实现 RuntimeException。
重要的实现类 DataSourceTranscationManager ,HibernateTranscationManager
DataSaourceTranscationManager
适用于 JDBC 和 Mybatis(ibatis) 连接数据库,使用该类进行事务管理。
HibernateTransactionManager
适用于Hibernate 连接数据库,使用该类进行事务管理。
【1.2】TranscationDefinition(事务定义接口)
【2】三种方式实现事务管理
【2.1】 使用事务代理工厂bean (TranscationProxyFactoryBean)(JDK的动态代理)
1,需要导入aop 的jar包。
2,编写applicationContext.xml
(1)注册事务管理器(DataSourceTranscationManager)
(2)注册事务代理工厂Bean(TranscationProxyFactoryBean)
其中在事务代理工厂Bean中,需要配置“事务定义接口”
<!-- =============================== AOP ==================================== -->
<!--需要事务管理 -->
<!-- 注册事务管理器: 最重要的三个方法 , 提交 回滚 获取事务 -->
<bean id="mytrancationManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"></property>
</bean>
<!-- 使用事务代理工场bean -->
<bean id="serviceManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 切面 -->
<property name="transactionManager" ref="mytrancationManager">
</property>
<!-- 目标类 -->
<property name="target" ref="buystockservice">
</property>
<!-- 事务定义 -->
<property name="transactionAttributes">
<props>
<prop key="init*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED
</prop>
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyException</prop>
</props>
</property>
</bean>
</beans>
查看源码
TranscationProxyFactoryBean
父类:
针对遇到受查异常,需要rollback的方法:
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyException</prop>
减去该异常即可。
两种异常的不同操作:
运行时异常:
受查异常:
使用事务代理工厂Bean,出现的两个问题:
【1】如果项目中有多个service 类需要事务管理,就会需要编写多个事务代理工厂bean。
【2】我们使用事务代理工厂Bean是代理对象获取的service对象,可是我们希望直接操作service对象。
【2.2】使用事务驱动注解(tx:annotation-driven)
1,导入Spring-tx.jar
2,在applicationContext.xml 文件中设置 事务注解驱动
<!-- =============================== AOP ==================================== -->
<!--需要事务管理 -->
<!-- 注册事务管理器: 最重要的三个方法 , 提交 回滚 获取事务 -->
<bean id="mytrancationManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"></property>
</bean>
<!--使用事务注解驱动 在service 方法上使用注解 -->
<tx:annotation-driven transaction-manager="mytrancationManager" />
3,修改service 层,添加事务注解
【2.3】使用AOP事务管理(最经常使用的方式)
1,在applicationContext.xml 配置
<!-- =============================== AOP ==================================== -->
<!--需要事务管理 -->
<!-- 注册事务管理器: 最重要的三个方法 , 提交 回滚 获取事务 -->
<bean id="mytrancationManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"></property>
</bean>
<!--使用aop -->
<tx:advice id="myadvice" transaction-manager="mytrancationManager">
<!-- 为连接点设置事务属性 -->
<tx:attributes>
<tx:method name="init*" isolation="DEFAULT" propagation="REQUIRED" />
<tx:method name="buyStock" isolation="DEFAULT" propagation="REQUIRED"
rollback-for="BuyException" />
</tx:attributes>
</tx:advice>
<aop:config>
<!--切入点 -->
<aop:pointcut expression="execution(* *..service.*.*(..))"
id="mypointcut" />
<aop:advisor advice-ref="myadvice" pointcut-ref="mypointcut" />
</aop:config>