Spring 事务管理,主要将事务由Dao层提升至Service层。
重要的三个方法(commit() rollback() getTransaction())
当发生运行时异常的时候回滚,受查异常的时候提交。
运行时异常需要实现 RuntimeException。
DataSaourceTranscationManager
适用于 JDBC 和 Mybatis(ibatis) 连接数据库,使用该类进行事务管理。
HibernateTransactionManager
适用于Hibernate 连接数据库,使用该类进行事务管理。
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对象。
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 层,添加事务注解
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>