在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。更详细的内容可以到网上查查资料,呵呵我也不是很熟悉,刚刚接触。。。。如果上面的理解有不对的地方,欢迎大家一起探讨。
分享到:
相关推荐
在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...
这是Spring声明式事务的核心注解,可以用于类或方法级别。当应用于类时,该类的所有公共方法都将包含在事务中。若应用于方法,只有该方法及其子方法才会被事务管理。注解中的属性包括`propagation`(事务传播行为)...
本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...
Spring框架中提供了两种事务管理方式:编程式事务管理和声明式事务管理。在本篇文章中,我们主要介绍编程式事务管理。 什么是编程式事务管理? 编程式事务管理是指通过编写代码的方式来进行事务管理。这种方式...
编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、提交、回滚等操作。这在某些特定场景下,如复杂的事务逻辑或需要自定义事务边界时,是很有用的。 首先,我们需要了解...
2. **声明式事务管理**:这是Spring最常用且推荐的方式,通过在配置文件(XML或Java配置)中声明事务属性,如@Transactional注解,让Spring自动管理事务的生命周期。这种方式简化了代码,提高了可读性,并且降低了...
编程式事务管理需要在代码中显式地开始、提交或回滚事务,而声明式事务管理则通过注解或XML配置来定义事务边界,更加灵活且易于维护。 Atomikos的集成通常涉及以下步骤: 1. 添加Atomikos的依赖到项目中。 2. 配置...
声明式事务管理则更推荐,只需在配置文件中声明事务边界,Spring会自动处理事务的开始、提交、回滚。例如,通过@Transactional注解,可以在方法级别定义事务的范围,如果方法执行过程中出现异常,Spring会自动回滚...
在Spring 3.0中,事务管理可以通过声明式方式实现,这通常涉及到在XML配置文件中定义`<tx:annotation-driven>`元素来启用事务管理。在与Hibernate集成时,Spring的PlatformTransactionManager接口的实现,如...
3. **声明式事务管理**:通过在配置文件或注解中声明事务规则,Spring可以自动管理事务的开始、提交、回滚,无需开发者手动处理。例如,`@Transactional` 注解可以在方法级别声明事务边界。 4. **编程式事务管理**...
Spring框架提供了一种声明式事务管理方式,开发者只需在服务层的方法上添加@Transactional注解,Spring就会自动管理事务的开始、提交、回滚等操作。这种方式使得事务管理变得简单而透明。 标签 "源码" 暗示了可能...
这个链接可能讨论了如何在Spring框架中集成不同的技术如iBatis,Struts2,Hibernate等,并且涉及到声明式事务管理。 标签“源码 工具”暗示我们可能会探讨到实际的代码实现和可能使用的工具。源码可能涉及Spring的...
3. **事务管理**:Spring 提供了声明式事务管理,使得开发者无需编写大量事务处理代码即可管理数据库事务。 4. **JDBC 支持**:Spring 提供了一个简单的 JDBC 抽象层,减少了直接使用 JDBC 的繁琐,同时支持与第三...
在Spring中,事务管理分为编程式事务管理和声明式事务管理两种方式。 1. **编程式事务管理**:程序员通过调用PlatformTransactionManager接口提供的方法来显式地开始、提交、回滚事务。这种方式灵活,但侵入性强,...
声明式事务管理通过配置实现,无需在业务代码中显式处理事务,使得代码更加简洁。 对于数据访问,Spring提供了JDBC抽象层,简化了数据库操作,同时支持ORM框架如Hibernate和MyBatis的集成,帮助开发者更高效地处理...
2. **事务管理**:Spring4支持编程式和声明式事务管理。声明式事务管理是通过在方法上使用@Transactional注解实现的,这使得事务边界变得简单明了,提高了代码的可读性。 3. **数据源配置**:在Spring中,数据源...
`@Transactional`注解是声明式事务管理的典型使用,其背后依赖于`TransactionInterceptor`。 5. **数据访问集成**:Spring支持多种持久化技术,如JDBC、ORM(对象关系映射)框架如Hibernate和MyBatis等。在源码中,...
编程式事务管理需要在代码中显式调用开始、提交或回滚事务,而声明式事务管理则通过配置声明事务边界,更加简洁。Spring的`PlatformTransactionManager`接口定义了事务管理的基本操作,具体实现如JDBC的`...
5. **事务管理**:Spring JDBC 支持编程式和声明式事务管理。编程式事务管理允许开发者显式控制事务的开始、提交和回滚,而声明式事务管理则通过 XML 或注解配置,使事务管理变得更为简洁。 6. **JDBC 模板扩展**:...
Spring提供了一种声明式事务管理的方式,只需要在配置文件中定义事务管理器,并在需要事务控制的Service层方法上添加@Transactional注解。例如,使用DataSourceTransactionManager作为事务管理器: ```xml ...