Spring配置事务管理和简化事务配置

14 篇文章 0 订阅
5 篇文章 0 订阅

一.使用TransactionProxyFactoryBean创建事务代理(通常事务代理以Service层为目标bean)


<bean id="personService" class="com.cong.personServiceImpl">
    <property name="personDao" ref="personDao"/>

</bean>

<!--在service层上添加事务,这里使用Spring提供的配置方式配置事务管理 。先定义一个HibernateTransactionManager管理器,然后把管理器配置到Service代码的代理类上(PersonServiceImpl不能直接加 事务,需要借助Spring代理类)--->

<!--配置hibernate的事务管理器,使用HibernateTransactionManager类,该类实现了PlatformTransactionManager接口,针对hibernate 持久化连接的特定实现-->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>

</bean>


<!-- 配置事务管理规则 -->
<bean id="hibernateTransactionAtttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<!-- 具备事务管理 的方法名 -->
<property name="properties">
<props>

 <prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
            <prop key="update*>PROPAGATION_REQUIRED</prop>

<prop key="*">PROPAGATION_REQUIRED</prop><!-- 所有方法都加上事务 -->
</props>
</property>
</bean>


<!--配置personService bean的事务工厂代理类-->
<bean id="personServiceProxy"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
           <!--指定事务管理器-->
    <property name="transactionManager" ref="transactionManager"/>
           <!--指定需要生成代理的目标bean-->
    <property name="persionService" ref="persionService"/>
           <!-- 设置事务管理规则 -->

<property name="transactionAttributeSource" ref="hibernateTransactionAtttributeSource"></property>

      </bean>

  为每个需要事务的bean做一次声明,如果所有的bean都基本上有一致的配置,这样就太繁琐啦。

二.使用自动创建代理简化事务配置
   <!-- hibernate事务管理器 -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property><!-- 配置sessionFactory -->
</bean>
<!-- 事务管理规则 -->
<bean id="nameMatch"
class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties"><!-- 具备事务管理的方法名 -->
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop><!-- 事务类型 -->
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED</prop><!-- 为所有方法都加事务 -->
</props>
</property>
</bean>
<!-- 配置事务拦截器 -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
<property name="transactionManager" ref="txManager" />
<property name="transactionAttributeSource" ref="nameMatch" />
</bean>
<!-- 定义BeanNameAutoProxyCreator,该bean是个bean后处理理器,无需被引用,可以没有id-->
<bean id="autoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="interceptorNames">
<list>
<idref local="transactionInterceptor" />
</list>
</property>
<!-- 下面是所有需要自动创建事务代理的bean  -->
<property name="beanNames">
<!-- 在下面可以添加想要加上事务的bean -->
<list>
<value>*Service</value><!--id以Service结束的Service bean都会添加上事务-->
</list>
</property>
</bean>


Spring中常用事务类型:

  • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值