Spring 事务管理

xiaoxiao2025-11-15  8

 

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>

转载请注明原文地址: https://www.6miu.com/read-5039715.html

最新回复(0)