-----------------------
Spring的事务管理
-------------------------
Spring提供了以下两种事务管理方法
第一种方法:声明式事务管理
---------------------------------------------
以AOP配置的形式实现事务管理:
applicationContext-transaction.xml
----------------------------------------------------
JDBC事务管理的方面组件:(DataSourceTransactionManager)
Hibernate事务管理的方面组件:(HibernateTransactionManager)
事务管理通知:<tx:advice>
切入点:根据实际情况编写表达式
例子:
<!-- 定义事务管理Bean -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory">
</property>
</bean>
<!-- 定义通知 -->
<tx:advice id="txAdvice"
transaction-manager="txManager">
<!-- 指定目标组件中的哪些方法采用哪种事务管理方式 -->
<tx:attributes>
<tx:method name="find*" read-only="true"
propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"
propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- AOP配置,将通知和切入结合(目标对象) -->
<aop:config>
<!-- 将所有DAO当做目标 -->
<aop:pointcut id="servicepointcut"
expression="within(com.tarena.netctoss.dao..*)"/>
<!-- 关联Advice和Pointcut -->
<aop:advisor advice-ref="txAdvice"
pointcut-ref="servicepointcut"/>
</aop:config>
------------------------------------------------
如果采用注解方式配置事务
applicationContext-transaction-annotation.xml
--------------------------------------------------
首先在applicationContext中开启事务注解
<!-- 定义事务管理Bean -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory">
</property>
</bean>
<!-- 开启事务注解配置 -->
<tx:annotation-driven
transaction-manager="txManager"/>
然后在目标组件中,使用@Transactional.
该标记可用在类定义和方法定前。类定义前指定全局,方法定以前指定当前方法。
例子:
@Transactional//默认采用REQUIRED方式管理事务
类前使用
@Transactional(readOnly=true,propagation=Propagation.REQUIRED)
方法前使用