`
zhangzuanqian
  • 浏览: 270023 次
  • 来自: ...
社区版块
存档分类
最新评论

Spring 自动代理事务 中碰到了事务无法回滚的问题

阅读更多


我是一个spring 学习的初手, 在学习spring in action这本书的 事务自动代理 章节时,按照所说的方式,我先配置了一个自动代理和事务属性源advisor,如下:

 

<bean id="autoproxy"
          class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
 </bean>

 <bean id="transactionAdvisor"
       class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
  <constructor-arg>
           <ref bean="tranInterceptor" />
   </constructor-arg>
 </bean>
<bean id="tranInterceptor"
  class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager">
          <ref bean="hibernateTranManager" />
  </property>
  <property name="transactionAttributeSource">
        <ref bean="tranAttribute1" />
  </property>
 </bean>

 

 而后,我配置属性源,书上说有两种方式位自动代理选择一个属性源

 

一:

<bean id="tranAttribute1"
		class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
		<property name="properties">
			<props>
				<prop key="insertPerson">
					PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException
				</prop>
			</props>
		</property>
	</bean>

 在我的测试代码中,事务是可以回滚的,也就是说,-PersonException是起作用的,测试代码我贴上部分

public void insertPerson(final Person p) throws PersonException{
		getHibernateTemplate().save(p);		
		throw new PersonException();
	}

  但是,当我按照第二种方式配置属性源,则,没有预期的产生事务回滚:

	<bean id="tranAttribute2"
		class="org.springframework.transaction.interceptor.MethodMapTransactionAttributeSource">
		<property name="methodMap">
		  <map>
			<entry key="com.dao.PersonDao1.insertPerson">					
				<value>
					PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException				</value>
			</entry>
		  </map>
		</property>
	</bean>

 

PS:用第二种属性源测试的时候,我上述拦截器tranInterceptor的transactionAttributeSource我换成了tranAttribute2的。

 

期望达人能帮小弟解决这个学习上的疑惑

 

谢谢

 

 

PS:此问题已经解决

 

问题的原因是:

 <entry key="com.dao.PersonDao1.insertPerson">
<value>
PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException </value>
</entry>


中的 <entry key="com.dao.PersonDao1.insertPerson">中的 key属性要是接口,而不是实际类

分享到:
评论

相关推荐

    spring 简单实例 事务回滚

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

    Spring/SpringMVC/MyBatis整合+事务回滚

    7. **实现事务回滚**:当在@Transactional注解的方法中发生异常时,Spring会自动回滚事务。例如,如果在保存数据时发生错误,整个事务将被回滚,保证数据的一致性。 8. **测试与调试**:完成整合后,通过编写单元...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    在Spring框架中,事务管理是核心特性之一,用于确保数据操作的一致性和完整性。当一个方法(A方法)内部调用另一个方法(B方法)时,可能会遇到事务控制...这个示例代码对于理解和调试Spring事务管理的问题非常有帮助。

    Spring+Mybatis整合事务回滚

    花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    - 提供了跨数据源的事务回滚能力,简化了系统设计,降低了处理多数据源时的复杂性。在除了分布式事务外的大多数情况下,只需考虑这个机制,就能保证事务的正确性。 在多租户SaaS架构中,数据隔离至关重要。常见的...

    Spring中@Transactional事务回滚(含实例

    如果方法执行过程中发生异常,代理对象会触发事务回滚。 五、事务回滚的局限性 需要注意的是,`@Transactional`注解只能对Spring管理的bean起作用,对于非Spring管理的对象(如静态方法或第三方库的代码),`@...

    spring-控制事物回滚

    我们将深入探讨Spring事务管理的原理、API使用以及在实际开发中的应用。 首先,Spring事务管理有编程式和声明式两种方式。编程式事务管理通过`PlatformTransactionManager`接口和`TransactionDefinition`接口来实现...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    #### Spring事务控制的基础概念 Spring框架支持两种类型的事务管理:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编码的方式来管理事务,适用于需要细粒度控制的情况。 - **声明式事务管理**:...

    spring事务与数据库操作

    ### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...

    spring事务操作试验

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

    Spring中的@Transactional事物回滚实例源码

    在`first_maven_project`中,我们可以通过查看源码,了解如何在实际应用中使用这个注解来处理事务,以及遇到异常时如何触发事务回滚。这有助于理解Spring事务管理机制的运作方式,从而提升开发和维护效率。

    JavaEE spring半自动bean管理事务案例

    Spring事务管理还支持编程式事务管理,但这需要开发者手动调用`TransactionTemplate`或`PlatformTransactionManager`来控制事务的开始、提交、回滚等操作,相对而言更复杂,但在某些特定场景下更有灵活性。...

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    Spring事务流程图

    Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...

    Spring中事务的传播属性详解

    ### Spring中事务的传播属性详解 #### 一、引言 在使用Spring框架进行应用程序开发时,事务管理是一项非常重要的特性。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其...

    spring学习事务源码

    2. **PlatformTransactionManager**: 这是Spring事务管理的顶级接口,提供了开始、提交、回滚事务的方法。根据底层数据源,如JDBC、Hibernate、JPA等,会有不同的实现,如DataSourceTransactionManager、...

    spring-tx事务管理实例

    Spring事务管理是企业级Java应用中不可或缺的一部分,它确保了数据的一致性和完整性,尤其是在多线程和分布式环境中。本实例将深入探讨Spring事务管理的实现与应用。 首先,Spring事务管理分为编程式事务管理和声明...

    Spring事务五种不同的代理配置

    在类上直接使用 @Transactional 注解,Spring 会创建基于类的代理,但是这种方式可能导致一些问题,例如:无法通过子类覆盖父类的方法来改变事务属性。 第五种方式:编程式事务管理 除了声明式事务管理,Spring 还...

    spring编程式事务实现

    6. **事务回滚规则**: 默认情况下,如果在事务回调中抛出未检查异常(继承自`RuntimeException`)或`Error`,Spring会自动回滚事务。对于已检查异常,需要显式设置`rollbackFor`属性,或在`TransactionCallback`中...

    spring 事务管理例子(TransactionProxyFactoryBean代理机制 和 tx/aop)

    - 回滚规则:默认情况下,只有运行时异常会导致事务回滚,检查异常不会。可以通过`rollbackFor`或`noRollbackFor`属性自定义。 总结来说,本例子通过`TransactionProxyFactoryBean`和`@Transactional`展示了如何在...

Global site tag (gtag.js) - Google Analytics