详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt123
首先先看配置文件:
- <!-- hibernate -->
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.hbm2ddl.auto">update</prop>
- <prop key="hibernate.show_sql">true</prop>
- <prop key="hibernate.format_sql">true</prop>
- <prop key="connection.autoReconnect">true</prop>
- <prop key="connection.autoReconnectForPools">true</prop>
- <prop key="connection.is-connection-validation-required">true</prop>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
- </props>
- </property>
- <property name="mappingDirectoryLocations">
- <list>
- <value>classpath*:*oddtech/bean</value>
- </list>
- </property>
- </bean>
- <!-- 事務管理 -->
- <bean id="txManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- <!-- 註解式事務的支持 -->
- <tx:annotation-driven transaction-manager="txManager" order="0"/>
- <!-- 服務事務註冊切面 -->
- <aop:config >
- <aop:pointcut expression="execution(* oddtech.service.impl.*.*(..))"
- id="txPoint" />
- <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint" order="1"/>
- </aop:config>
- <tx:advice transaction-manager="txManager" id="txAdvice">
- <tx:attributes >
- <tx:method name="find*" propagation="REQUIRED" read-only="true"
- rollback-for="Exception" />
- <tx:method name="select*" propagation="REQUIRED" read-only="true"
- rollback-for="Exception" />
- <tx:method name="insert*" propagation="REQUIRED"
- rollback-for="Exception" />
- <tx:method name="delete*" propagation="REQUIRED"
- rollback-for="Exception" />
- <tx:method name="update*" propagation="REQUIRED"
- rollback-for="Exception" />
- <tx:method name="modify*" propagation="REQUIRED"
- rollback-for="Exception" />
- <tx:method name="*" read-only="true"
- rollback-for="Exception" />
- </tx:attributes>
- </tx:advice>
。
当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,相当于在执行new Test().insert() 方法执行2次AOP切面。那么我们需要通过order 属性去定义AOP切面的先后执行顺序。 order越小,在AOP的chain 中越靠前,越先执行。(chain模式)
,
所以 我们需要在<tx:annotation-driven transaction-manager="txManager" order="0"/>中加入order属性为0,<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint" order="1"/>加入order 属性为1.那么他们两个的执行顺序如下:
。这样就属于事务嵌套。
那么我们再看上边说的例子:当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,那么我们想让insert 方法只读,read-only=true,那么我们需要这样去定义:@Transactional(readOnly = true,propagation=Propagation.REQUIRED),为什么呢?
在声明事务中,我们对insert 的事务传播级别定义为:REQUIRED,关于事务传播级别,请参照http://blog.csdn.net/feng27156/article/details/8534609,那么在注解事务中我们定义REQUIRED 的事务。声明事务在使用注解定义的事务级别。
除非在特殊的情况下,注解事务不要和声明事务有冲突。声明事务定义的是统一的规则,如果你想让某一个方法有特殊的事务传播机制的话,那么不要和统一的规则有冲突。
<tx:method name="*" read-only="true" rollback-for="Exception" />
按照規則,定義一個test方法,加入:@Transactional定義。则test 方法爲read-only=false,propagation=REQUIRED。這是默認的。統一規則<tx:method name="*" read-only="true" rollback-for="Exception" />不會對test方法的註解事務衝突。
相关推荐
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。Spring提供了多种事务管理方式,其中基于注解的事务管理是近年来常用的模式,因为它简化了代码并提高了可读性。本文将...
本文将深入探讨Spring中的几种事务配置方式,帮助开发者更好地理解和运用。 1. **编程式事务管理** 编程式事务管理是在代码中显式调用事务API来控制事务的开始、提交、回滚等操作。这种方式直接在业务逻辑代码中...
通过上述内容,我们可以看到Spring JDBC结合注解事务管理,极大地简化了事务控制,让开发更高效,同时也保持了代码的整洁性。在实际项目中,结合Spring的AOP(面向切面编程)和IoC(依赖注入)特性,事务管理变得...
2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离,降低了代码的耦合度。`@Transactional`注解可以应用于方法级别,表示该...
即使在已有事务中也如此)、`PROPAGATION_NOT_SUPPORTED`(不支持事务,如果存在事务则挂起)、`PROPAGATION_NEVER`(永不运行在事务中)和`PROPAGATION_NESTED`(如果当前存在事务,则在嵌套事务内运行,否则...
Spring 声明式事务管理是Spring框架中的一个重要特性,它允许开发者在不编写任何事务管理代码的情况下,通过配置来管理事务。这种方式极大地简化了事务处理,并提高了代码的可维护性。以下是关于Spring声明式事务...
编程式事务管理需要在代码中显式地调用开始、提交、回滚等事务操作,而声明式事务管理则是通过在配置文件或注解中声明事务规则,使得事务处理更加简洁和灵活。本笔记主要关注后者。 1. **声明式事务管理**: 这种...
SUPPORTED(不支持事务,如果有事务则挂起)、NEVER(不允许存在事务,如果有则抛出异常)、NESTED(嵌套事务,如果当前事务存在,则在嵌套事务内执行,否则新建事务)。 4. **Spring的回滚规则**:默认情况下,...
在Spring框架中,声明式事务管理是通过AOP(面向切面编程)实现的,它允许开发者无需在业务代码中显式处理事务,而是通过配置来控制事务的边界。Spring提供了四种不同的方式来配置声明式事务,这使得事务管理更加...
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...
Spring的事务管理器,如DataSourceTransactionManager或JtaTransactionManager,会根据这些配置来决定何时开始、提交、回滚事务,以及在需要时如何暂停和恢复事务。 在Java后端开发中,Spring的事务管理机制大大...
在Spring中,声明式事务主要通过AOP(面向切面编程)实现,它允许我们在不修改业务代码的情况下,通过XML配置或Java配置,以及注解来控制事务的边界。 3. **XML配置事务** 在Spring的XML配置文件中,可以通过`...
在Spring中,事务管理分为编程式和声明式两种方式,而声明式事务处理则是通过配置来控制事务的行为,使得代码与事务逻辑解耦,提高了代码的可读性和可维护性。 首先,我们要理解什么是事务。事务是数据库操作的一组...
- 配置:在Spring的XML配置文件中,使用`<tx:annotation-driven>`启用基于注解的事务管理。 - 注解:在需要事务控制的方法上使用`@Transactional`注解,该注解可以指定事务的传播行为、隔离级别、读写模式等属性。...
而声明式事务管理则通过配置元数据(如XML或注解)来定义事务的边界和传播行为,这种方式更为简洁且易于维护。 ### 数据库连接配置与Hibernate整合 在给定的示例中,首先展示了数据库连接的配置文件,该文件遵循...
本篇将详细讲解Spring AOP如何进行事务配置,包括注解和非注解两种方式。 1. **注解方式的事务管理** - **@Transactional**:这是Spring提供的核心注解,用于标记在一个方法或类上开启事务。当被注解的方法执行时...
在Spring中,事务管理器会根据配置决定何时开始和结束事务,以及如何处理异常。当数据库表的结构与事务操作相关时,这样的脚本可以帮助我们理解数据在事务中的变化过程。 接下来,`Nested`文件可能包含了具体的Java...
当出现多个事务嵌套的场景发生时,Spring 事务的处理会变得复杂一些,需要考虑嵌套事务下的提交顺序,以及回滚顺序。对此,Spring 提供了多种的传播机制,每种传播机制的效果都不尽相同,以便应对各种复杂的业务场景...