`
azheng270
  • 浏览: 93252 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Spring中的声明式事务管理的一篇讨论

阅读更多

在applicationContext中配置的时候,看到有这样做的:

<beans>

...

<beanid="myTransactionManager"class="org.springframework.orm.hibernate.HibernateTransactionManager">
<propertyname="sessionFactory">
<refbean="mySessionFactory"/>
</property>
</bean>

<beanid="myProductServiceTarget"class="product.ProductServiceImpl">
<propertyname="productDao">
<refbean="myProductDao"/>
</property>
</bean>

<beanid="myProductService"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<propertyname="transactionManager">
<refbean="myTransactionManager"/>
</property>
<propertyname="target">
<refbean="myProductServiceTarget"/>
</property>
<propertyname="transactionAttributes">
<props>
<propkey="increasePrice*">PROPAGATION_REQUIRED</prop>
<propkey="someOtherBusinessMethod">PROPAGATION_MANDATORY</prop>
</props>
</property>
</bean>

</beans>


那么product.ProductServiceImpl的方法不需要管理事务吗?这个target bean有什么用途?是不是只有target 指定的bean按照这种方式管理事务?

最近我也在使用spring的hibernate implement,刚开始配置的时候,我只是简单的配置了applicationContext-service.xml:

代码:

<beanid="personManager"class="com.entertop.callcenter.service.implement.PersonManagerImpl"singleton="false">
<propertyname="personDAO"><reflocal="personDAO"/></property>
</bean>


没有指定TransactionProxy,结果,在进行数据库操作的时候,所有的事务都没有提交。
应用框架应该是这样的:WEB-Control-Business Delegate-Persistence tier-DataBase,一般来说,在Persistence tier应该不包含Transaction代码,也就是说在持久层提供的CRUD方法中都不应该封装Transaction,这个Transaction应该在Business Delegate中封装,因为所有的事务处理都是和业务逻辑绑定的,比如:有一个增加VIP会员的业务需要增加一条记录并且更新另外一个表中的状态,你的BD层中有一个对应的addVIP()的方法,实际上addVIP分别调用了P层的两个表的DAO接口的add和update方法,通过Spring提供的TransactionProxy,在业务层基本进行事务提交,那么你就应该这么配置applicationContext-service.xml:
代码:

<beanid="personManagerTarget"class="com.entertop.callcenter.service.implement.PersonManagerImpl"singleton="false">
<propertyname="personDAO"><reflocal="personDAO"/></property>
</bean>
<beanid="personManager"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<propertyname="transactionManager"><reflocal="transactionManager"/></property>
<propertyname="target"><reflocal="personManagerTarget"/></property>
<propertyname="transactionAttributes">
<props>
<propkey="add*">PROPAGATION_REQUIRED</prop>
<propkey="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>


看到了上面的<prop key="add*">PROPAGATION_REQUIRED</prop>这一句吗?Spring的TransactionProxyFactoryBean会在personManagerTarget方法调用add*方法之前开始一个事务,并在成功执行以后提交一个事务。当然也不用每一个BD层的类都配置这样一个事务,你可以使用BeanNameAutoProxyCreator来为每个类自动创建TransactionProxy。更详细的内容可以到网上查查资料,呵呵我也不是很熟悉,刚刚接触。。。。如果上面的理解有不对的地方,欢迎大家一起探讨。
分享到:
评论

相关推荐

    Xml文件配置实现声明式事务管理

    在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...

    使用Spring的声明式事务----Annotation注解方式

    这是Spring声明式事务的核心注解,可以用于类或方法级别。当应用于类时,该类的所有公共方法都将包含在事务中。若应用于方法,只有该方法及其子方法才会被事务管理。注解中的属性包括`propagation`(事务传播行为)...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...

    详解Spring学习之编程式事务管理

    Spring框架中提供了两种事务管理方式:编程式事务管理和声明式事务管理。在本篇文章中,我们主要介绍编程式事务管理。 什么是编程式事务管理? 编程式事务管理是指通过编写代码的方式来进行事务管理。这种方式...

    spring学习之八--Hibernate编程式事务

    编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、提交、回滚等操作。这在某些特定场景下,如复杂的事务逻辑或需要自定义事务边界时,是很有用的。 首先,我们需要了解...

    chap05.rar 源代码,配合spring的事务管理那个博文的

    2. **声明式事务管理**:这是Spring最常用且推荐的方式,通过在配置文件(XML或Java配置)中声明事务属性,如@Transactional注解,让Spring自动管理事务的生命周期。这种方式简化了代码,提高了可读性,并且降低了...

    spring hibernate atomikos 分布式事务

    编程式事务管理需要在代码中显式地开始、提交或回滚事务,而声明式事务管理则通过注解或XML配置来定义事务边界,更加灵活且易于维护。 Atomikos的集成通常涉及以下步骤: 1. 添加Atomikos的依赖到项目中。 2. 配置...

    struts2+spring+hibernate分页,事务,自定义切面

    声明式事务管理则更推荐,只需在配置文件中声明事务边界,Spring会自动处理事务的开始、提交、回滚。例如,通过@Transactional注解,可以在方法级别定义事务的范围,如果方法执行过程中出现异常,Spring会自动回滚...

    SpringTest

    在Spring 3.0中,事务管理可以通过声明式方式实现,这通常涉及到在XML配置文件中定义`&lt;tx:annotation-driven&gt;`元素来启用事务管理。在与Hibernate集成时,Spring的PlatformTransactionManager接口的实现,如...

    spring培训的例子

    3. **声明式事务管理**:通过在配置文件或注解中声明事务规则,Spring可以自动管理事务的开始、提交、回滚,无需开发者手动处理。例如,`@Transactional` 注解可以在方法级别声明事务边界。 4. **编程式事务管理**...

    Ibatis 事务处理

    Spring框架提供了一种声明式事务管理方式,开发者只需在服务层的方法上添加@Transactional注解,Spring就会自动管理事务的开始、提交、回滚等操作。这种方式使得事务管理变得简单而透明。 标签 "源码" 暗示了可能...

    咕泡学院_Tom_JavaVIP课程_深入分析Spring源码(第一阶段)1

    3. **事务管理**:Spring 提供了声明式事务管理,使得开发者无需编写大量事务处理代码即可管理数据库事务。 4. **JDBC 支持**:Spring 提供了一个简单的 JDBC 抽象层,减少了直接使用 JDBC 的繁琐,同时支持与第三...

    配置事务通知

    这个链接可能讨论了如何在Spring框架中集成不同的技术如iBatis,Struts2,Hibernate等,并且涉及到声明式事务管理。 标签“源码 工具”暗示我们可能会探讨到实际的代码实现和可能使用的工具。源码可能涉及Spring的...

    sample

    在Spring中,事务管理分为编程式事务管理和声明式事务管理两种方式。 1. **编程式事务管理**:程序员通过调用PlatformTransactionManager接口提供的方法来显式地开始、提交、回滚事务。这种方式灵活,但侵入性强,...

    springdemo.zip

    声明式事务管理通过配置实现,无需在业务代码中显式处理事务,使得代码更加简洁。 对于数据访问,Spring提供了JDBC抽象层,简化了数据库操作,同时支持ORM框架如Hibernate和MyBatis的集成,帮助开发者更高效地处理...

    第十一章 Spring4 JDBC

    2. **事务管理**:Spring4支持编程式和声明式事务管理。声明式事务管理是通过在方法上使用@Transactional注解实现的,这使得事务边界变得简单明了,提高了代码的可读性。 3. **数据源配置**:在Spring中,数据源...

    官方原版源码spring-framework-5.0.14.RELEASE.zip

    `@Transactional`注解是声明式事务管理的典型使用,其背后依赖于`TransactionInterceptor`。 5. **数据访问集成**:Spring支持多种持久化技术,如JDBC、ORM(对象关系映射)框架如Hibernate和MyBatis等。在源码中,...

    Spring 学习笔记三

    编程式事务管理需要在代码中显式调用开始、提交或回滚事务,而声明式事务管理则通过配置声明事务边界,更加简洁。Spring的`PlatformTransactionManager`接口定义了事务管理的基本操作,具体实现如JDBC的`...

    spring jdbc

    5. **事务管理**:Spring JDBC 支持编程式和声明式事务管理。编程式事务管理允许开发者显式控制事务的开始、提交和回滚,而声明式事务管理则通过 XML 或注解配置,使事务管理变得更为简洁。 6. **JDBC 模板扩展**:...

    Spring3.1.1+MyBatis3.1.1的增、删、查、改以及分页和事务管理

    Spring提供了一种声明式事务管理的方式,只需要在配置文件中定义事务管理器,并在需要事务控制的Service层方法上添加@Transactional注解。例如,使用DataSourceTransactionManager作为事务管理器: ```xml ...

Global site tag (gtag.js) - Google Analytics