Spring 事务管理

 

Spring 事务管理,主要将事务由Dao层提升至Service层。

【1】平台事务管理器(PlatformTranscationManager)和 事务定义接口(TranscationDefinition)

Spring 事务管理

【1.1】平台事务管理器(PlatformTranscationManager)

 重要的三个方法(commit()  rollback()  getTransaction())

Spring 事务管理

当发生运行时异常的时候回滚,受查异常的时候提交。

运行时异常需要实现 RuntimeException。

重要的实现类 DataSourceTranscationManager ,HibernateTranscationManager

Spring 事务管理

 DataSaourceTranscationManager  

适用于 JDBC  和 Mybatis(ibatis) 连接数据库,使用该类进行事务管理。

 HibernateTransactionManager

适用于Hibernate 连接数据库,使用该类进行事务管理。

【1.2】TranscationDefinition(事务定义接口)

Spring 事务管理

【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

Spring 事务管理

父类:

Spring 事务管理

针对遇到受查异常,需要rollback的方法:

<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyException</prop>

减去该异常即可。

两种异常的不同操作:

运行时异常:

Spring 事务管理

受查异常:

Spring 事务管理

使用事务代理工厂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 层,添加事务注解

Spring 事务管理

【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>

Spring 事务管理