`
wgcniler
  • 浏览: 5517 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

转:spring事务控制配置实例

阅读更多

Spring声明式事务配置的几种方法
在Spring中进行事务控制首先要选择适当的事务管理器,其次为程序选择划分事务的策略。如果只有单个事务性资源,可以从“单一资源”的 PlatformTransactionManger实现当中选择一个,这些实现 有:DataSourceTransactionManager,HibernateTransactionManager, JdoTransactionManager,PersistenceBrokerTransactionManager和 JmsTransactionManager。根据你所采用的数据库持久化技术选择。如果你的项目运行于支持JTA的服务器,那么将选择 JtaTransactionManger,将会支持多资源事务。
下表将为你选择适当的事务管理器提供参考。

技术               事务管理器(————后)           内建的事务支持(括号内)
JDBC————DataSurceTransactionManager
        JtaTransactionManager
        (JdbcTemplate和org.springframework.jdbc.object包中的所有类 )
IBATIS————DataSourceTransactionManager
          JtaTransactionManager
        (SqlMapClientTemplate和SqlClientTemplate)
Hibernate————HibernateTransactionManager
             JtaTransactionManager
             (HibernateTemplate和HibernateInterceptor)
JDO————JdoTransactionManager
       JtaTransactionManager
       (JdoTemplate和JdoInterceptor)
ApacheOJB————PersistenceBrokerTransactionManager
             JtaTransactionManager
             (PersistenceBrokerTemplate)
JMS————JmsTransactionManager
       (JmsTemplate)



在划分事务时,我们需要进行事务定义,也就是配置事务的属性。事务的属性有传播行业,隔离级别,超时值及只读标志。TransactionAttribute接口指定哪些异常将导致一个回滚,哪些应该一次性提交。


  

(1) 使用ProxyFactoryBean 和TransactionInterceptor

<!--定义本地数据源-->

<bean id="dataSource" name="dataSource" class="org.apache.commons.dbcp.BasicDataSource"           destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>


<!-- !定义单个jdbc数据源的事务管理器-->
<bean id="transactionManager"               class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

   <!—定义拦截器-->
<bean id="transactionInterceptor"
       class="org.springframework.transaction.interceptor.TransactionInterceptor">
     <property name="transactionManager">
      <ref bean="transactionManager"/>
     </property>
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>

<!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService.target"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>

<!—定义业务对象的事务代理对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService" class="org.springframeword.aop.framework.ProxyFacgtoryBean">
  <property name="target"
     ref="com.prs.application.ehld.sample.biz.service.sampleService.target">
  </property>
  <property name="interceptorNames">
     <value>transactionInterceptor</value>
  </property>
</bean>

通过ProxyFacgtoryBean和TransactionInterceptor组合使用,可以对事务进行更多的控制。所有需要事务控制的对象可以共享一个transactionInterceptor的事务属性。

(2) 使用TransactionProxyFactoryBean

  <!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService.target"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>

    <!—定义业务对象的事务代理对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
<property name="target"
          ref="com.prs.application.ehld.sample.biz.service.sampleService.target" />
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>

使用TransactionProxyFactoryBean需要为每一个代理对象都去定义自己的事务属性。

(3) 使用TransactionProxyFactoryBean及abstract属性来简化配置
这种方工也是目前使用得最多的一种声明式事务配置方法


<!--事务控制代理抽象定义 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        abstract="true">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>

  <!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService.target"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>

<!—定义业务对象的事务代理对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService" parent="baseTransactionProxy">
  <property name="target"
     ref="com.prs.application.ehld.sample.biz.service.sampleService.target">
   </property>
</bean>

使用abstract属性,可以让代理对象可以共享一个定义好的事务属性,使配置简化。

(4)使用BeanNameAutoProxyCreator
    <!—定义拦截器-->
<bean id="transactionInterceptor"
       class="org.springframework.transaction.interceptor.TransactionInterceptor">
     <property name="transactionManager">
      <ref bean="transactionManager"/>
     </property>
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>


<!—定义bean别名自动代理创建器-->
<bean id="autoProxyCreator"
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
        <value>transactionInterceptor</value>
    </property>
    <property name="beanNames">
      <list>
       <idref local="com.prs.application.ehld.sample.biz.service.sampleService"/>
      </list>
    </property>
</bean>

  <!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>

分享到:
评论

相关推荐

    Spring使用TransactionProxyFactoryBean声明式事务配置实例

    Spring使用TransactionProxyFactoryBean声明式事务配置实例

    Spring ax/aop声明式事务配置实例

    Spring ax/aop声明式事务配置实例

    Spring Hibernate事务实例

    Spring+Hibernate 使用TransactionInterceptor声明式事务配置

    Spring综合实例 spring配置oracel数据库 事务管理 切面

    Spring综合实例 spring配置oracel数据库 事务管理 切面 业务描述:实现用户简单的注册登录功能。 用户注册时候需要输入用户名,密码,邮箱地址,点击注册后成功。 用户登录时可以选择使用用户名或者邮箱地址进行...

    spring事务操作试验

    spring事务操作试验 博客地址:https://blog.csdn.net/u010476739/article/details/99130972

    JAVA中spring介绍以及个人使用心得

    开发人员可以通过配置文件或注解来描述对象之间的关系,Spring框架负责实例化和管理这些对象。 面向切面编程(AOP):Spring框架支持面向切面编程(AOP),可以将横切关注点(如日志记录、事务管理)与应用程序的...

    spring3+hibernate4声明式事务配置(xml方式)

    一个实例小工程,说的是spring3+hibernate4怎么配置声明式事务管理(xml方式)

    spring 配置事务

    无spring 配置事务 spring+hibernate实例

    struts+hibernate+spring事务配置_花粉册.rar

    struts+hibernate+spring事务配置_花粉册.rar 超详细配置,有图片实例

    商店:spring cloud最佳实践项目实例,使用了spring cloud全家桶,TCC事务管理,EDA事务最终一致性等技术的下单示例

    项目简介 此商城项目,使用spring cloud全家桶进行开发 事务处理使用两种:强一致性(TCC),最终一致性(EDA) 使用技术 java 8:使用lambda表达式,...spring cloud config:集中配置管理,整合各个微服务下的不同

    Spring+3.x企业应用开发实战光盘源码(全)

     第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。  第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有...

    Spring的学习笔记

    (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步...

    spring.doc

    1 Spring基本特征 6 2 Spring的组成 6 2.1 Spring的jar包 6 2.2 Spring配置文件 7 2.3 Spring API 8 3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的...实例: 146

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

    SpringColud1简易分布式

    SpringColud1简易分布式 ● cloud-config-server:配置服务器-(通过git获取配置) ● cloud-eureka-server:eureka注册服务器 ● cloud-simple-service:一个使用mybatis的数据库应用,服务端 ● cloud-simple-...

    spring2.5 学习笔记

    (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步...

    Spring.html

    控制反转:把创建对象的权利交给Spring 创建对象 1.无参构造 2.静态工厂 3.实例工厂 管理对象 对象关系DI 构造器注入 set注入 生命周期 scope:prototype/singleton init-method destroy-...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    一个小实例工程,说的是spring3+hibernate4配置声明式事务管理(annotation方式)

    第24次课-1 Spring与Hibernate的整合

    持久层访问必需的事务控制 24.1 概述 24.1.1 概述 Spring的管理方式: 将DataSource、SessionFactory、Transaction等作为Spring的Bean,通过配置文件的方式来管理。 24.1 概述 24.1.1 概述 Spring提供了DAO支持,...

    spring2.5学习PPT 传智博客

    使用Spring配置文件实现事务管理 25.搭建和配置Spring与Hibernate整合的环境 26.Spring集成的Hibernate编码与测试 27.Struts与Spring集成方案1(Struts集成Spring) 28.Struts与Spring集成方案2(Spring集成Struts)...

Global site tag (gtag.js) - Google Analytics