`

转: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>
分享到:
评论
2 楼 TeddyWang 2011-01-12  
现在基本已经不这么做了,你把问题说详细。
1 楼 shuang_snowgirl 2011-01-12  
我用通知也可以吧
可是我配置的事务不管用,再删除数据时就是没用,也不报错
只能查询。能给指点一下吗?
<!-- 事务管理器 -->
	<bean id="transacationManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>


	<!-- 事务通知  -->
	<tx:advice id="transactionBase" transaction-manager="transacationManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="*" read-only="true" propagation="SUPPORTS" />
		</tx:attributes>
	</tx:advice>

	<!-- 事务控制 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.util..*.*(..))"
			id="myTransaction" />
		<aop:advisor advice-ref="transactionBase" pointcut-ref="myTransaction" />
	</aop:config>

相关推荐

    spring_事务管理(实例代码)

    Spring事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...

    spring-tx事务管理实例

    本实例将深入探讨Spring事务管理的实现与应用。 首先,Spring事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理是通过调用TransactionTemplate或直接使用PlatformTransactionManager接口来控制...

    spring 简单实例 事务回滚

    总之,这个“spring简单实例 事务回滚”案例为我们提供了一个学习Spring事务管理的好起点。通过理解如何配置事务管理器,使用`@Transactional`注解,以及异常处理机制,我们可以更好地掌握Spring如何保证数据的一致...

    spring+ibatis配置实例

    总结来说,"spring+ibatis配置实例"是一个完整的Java Web项目,它展示了如何利用Spring框架进行服务层和控制层的构建,结合iBatis进行数据访问。通过学习这个实例,开发者可以更好地理解Spring和iBatis的整合使用,...

    spring事务案例分析.zip

    7. **案例分析**:"SPRING事务管理案例分析.docx"很可能包含了具体的项目实例,详细讲解了如何在Spring项目中配置和使用事务管理,以及如何解决实践中遇到的问题。而"studyspring"可能是源代码目录,包含了实现这些...

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

    在Spring框架中,声明式事务管理是通过元数据(如XML配置或注解)来定义事务边界,使得开发者无需在业务代码中显式调用事务管理API,即可实现事务的控制。TransactionProxyFactoryBean是Spring提供的一种工具,用于...

    Spring Hibernate事务实例

    本教程将深入探讨如何在Spring框架中利用`TransactionInterceptor`进行声明式事务管理,与Hibernate集成实现高效的数据库事务控制。 首先,了解事务管理是至关重要的。事务是一组数据库操作,这些操作要么全部成功...

    SSH 配置实例: Spring 3.1 + Hibernate 4.2 + Struts 2.3

    本配置实例将探讨如何在Spring 3.1、Hibernate 4.2和Struts 2.3之间进行集成,以实现数据持久化、业务逻辑处理和前端展现的无缝对接。 首先,Spring框架作为核心容器,负责管理应用对象的生命周期和依赖关系。在...

    Spring事务管理配置

    在深入探讨Spring事务管理配置之前,我们先简要回顾一下Spring框架的核心概念。Spring是一个开源的Java平台,它提供了一套全面的编程和配置模型,旨在简化企业级应用的开发。其中,事务管理是Spring框架中的一个重要...

    spring 事务代理配置

    ### Spring事务管理——声明式事务配置详解 #### 引言 在现代的Java企业级应用开发中,事务处理是确保数据一致性和完整性的重要机制。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务管理方式。...

    spring声明式事务配置

    根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...

    spring_hibernate整合实例

    4. **事务管理**:Spring提供了声明式事务管理,允许开发者在XML配置或注解中定义事务边界,降低了事务管理的复杂性。 5. **DAO(数据访问对象)和Service层**:Spring可以帮助我们创建DAO和Service层,其中DAO层...

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

    本实例将深入探讨如何在Spring中使用AOP来实现声明式事务配置。 一、Spring AOP基础 AOP允许我们在程序运行时动态地将代码插入到其他对象中,它主要用来处理那些具有横切关注点的问题,如日志、异常处理和事务管理...

    Spring使用XML配置声明式事务

    这个标签告诉Spring容器自动检测带有@Transactional注解的类,并根据注解中的属性进行事务配置。 接下来,我们需要配置数据源和事务管理器。数据源(DataSource)是连接到数据库的资源,Spring提供了多种数据源实现...

    Spring基于XML方式配置事务

    在Spring配置文件中,我们需要引入`tx`命名空间,并声明一个`PlatformTransactionManager`实例,例如,对于基于JDBC的事务管理,我们会使用`&lt;bean id="transactionManager" class="org.springframework.jdbc....

    spring事务操作试验

    本文将深入探讨在"spring事务操作试验"中涉及的关键知识点,并结合提供的资源进行详细阐述。 首先,Spring事务管理的核心概念是ACID(原子性、一致性、隔离性和持久性),这是所有事务系统的基础。在Spring中,事务...

    spring hibernate mysql 事务实例

    在Spring与Hibernate的结合下,MySQL的事务控制可以通过设置不同的隔离级别(如READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)来优化并发性能和避免数据竞争问题。 在实际开发中,我们还需要...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    5. **MVC框架**:Spring的Web MVC框架是一种高度可配置的模型-视图-控制器框架,用于构建Web应用程序。 ### Spring架构分析 Spring框架的设计基于模块化思想,其架构可以分为以下几个核心模块: 1. **核心容器**...

Global site tag (gtag.js) - Google Analytics