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的方式进行配置!!

 

posted @ 2012-11-15 10:25  陈欢  阅读(323)  评论(0编辑  收藏  举报