Spring-Hibernate-Annotation-Xml声明式事务管理
一.Annotation方式
beans.xml中的配置如下:
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
在service层的方法示例如下:
@Transactional
public boolean addAdmin(Admin a) throws Exception{
boolean flag = false;
flag = this.admindao.addAdmin(a);
this.admindao.delAdmin(100); //此操作会发生异常
return flag;
}
@说明:
在声明式事务管理中,采用的是@Transactional注解在需要添加的事务方法之上,当方法获取到异常时,事务就不会提交。
HibernateTransactionManager使用了AOP编程模式、即在方法前后加上事务的管理,以达到数据同步,它需要注入sessionFactory
里的数据库的dataSource。
@Transaction的集体属性可以参考Spring API进行属性设置,其中propagation是很有必要理解的概念:
propagation:中文含义繁殖、衍生,在spring中意指事务的传播特性,默认值为PROPAGATION_REQUIRED,根据图形解释含义:
当执行到方法1时,而方法1里面调用了方法2,如果在方法1里面理解有Transaction了,那么方法2里面就不需要创建新的Transaction了。
以上实例说明:在调用addAdmin()时,如果当前已经有一个Transaction了,那么就会使用原来的Transaction,它不会重新起一个新的Transaction了。
其他参数说明:
MANDATORY:表示当前方法如果要执行,必须要有一个Transaction,如果没有,则会抛出异常。
NESTED:表示如果执行到此方法,原来的Transaction暂停,起一个新的Transaction,新的Transaction执行完了在执行原来的Transaction。
NEVER:表示如果当前方法想执行,必须不能有事务,如果有事务就会抛异常。
NOT_SUPPORTED:表示当前方法要执行,必须不能有事务,如果有事务,将会挂起事务,等待方法执行完毕后再执行原来的事务。
REQUIRED_NEW:表示如果当前有Transaction,那么挂起原来的Transaction,创建一个新的Transaction。
SUPPORT:表示如果当前有事务,该方法就在事务中执行,如果当前没有,那么就不在事务中执行。
二、XML方式
beans.xml中的配置:
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="adminServiceOperation" expression="execution(public * com.chenhuan.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="adminServiceOperation"/>
</aop:config>
大多数情况下,我们采用的是XML的方式进行配置!!