spring中的@Transaction配置详解
1、Spring默认Transactional事物管理机制
如果程序抛出的是运行期例外,则数据回滚 事物处理
如果是重新Exception例外,则数据不会滚。
可以通过配置修改该规则
@Transactional(noRollbackFor=RuntimeException.class)方法事物说明
@Transactional(RollbackFor=Exception.clas)
@Transactional(readyOnly=true)
@Transactional(timeout=100)默认30
@Transactional(isolation)数据库的隔离级别
{
Read Uncommited:读取未提交的数据(会出现脏读 不可重复读 幻读)
Read Commited:读已提交的数据(会出现不可重复读和幻读)
Repeatable Read:可重复读(会出现幻读)
Serializable:串行化
}
脏读:一个事务读取到另外一个事务未提交的更新的数据
不可重复读:在同一个事务中,多次读取同一个数据返回结果有所不同,就是后续的读取可以读到另外一个事务的已经提交的更新数据
可重复读:在同一个事务多次读取数据时,能够保证所读取的数据一样,也就是后读取的不能读到另外一个事务已经提交的数据
幻读: 一个事务读取到另外一个事务已经提交的更新的数据
针对查询方法
@Transactional(propagation=Propagation.NOT_SUPPORTED)针对某个方法不开启事务
@Transactional(propagation=Propagation.REQUIRED)spring默认的事务支持
Propagation参数解析
1、REQUIRED:业务方法需要在一个事务中运行。如果方法运行中,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。
2、NOT_SUPPORIED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。
3、REQUIRES_NEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起, 新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。
4、MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器会抛出例外。
5、SUPPORTS:这一事务属性表
<!-- 事务策略配置管理器
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。spring默认的事务策略
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
-Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交
readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用.
设置强制使用CGLIB生成代理(spring代理方式 另外一种 JDKProxy动态代理)
<property name="optimize" value="true" />
-->
<!-- <bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_NOT_SUPPORTED,readOnly</prop>
<prop key="find*">PROPAGATION_NOT_SUPPORTED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="read*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="change*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
<property name="optimize" value="true" />
</bean> -->
<!-- 采用AOP拦截的方式实现事务管理 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="transacationPointcut" expression="execution(* com.main.admin.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvisor" pointcut-ref="transacationPointcut"/>
</aop:config>
<tx:advice id="txAdvisor" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="find*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="query*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="read*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="load*" read-only="true" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="create*" 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="change*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="remove*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
分享到:
相关推荐
### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...
本文将深入探讨Spring中的几种事务配置方式,帮助开发者更好地理解和运用。 1. **编程式事务管理** 编程式事务管理是在代码中显式调用事务API来控制事务的开始、提交、回滚等操作。这种方式直接在业务逻辑代码中...
《Spring 事务管理详解》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的事务管理是其核心特性之一,对于保证应用程序数据的一致性和完整性至关重要。"spring-transaction.jar...
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
Spring 事务配置是Spring 框架中的重要组成部分,它提供了对数据库操作事务性的管理,确保数据的一致性和完整性。Spring 提供了多种方式来配置事务管理,主要分为编程式事务管理和声明式事务管理。下面将详细介绍这...
### Spring + Hibernate 详解与配置 #### Spring框架概述 Spring框架是一个开源的、轻量级的应用框架,旨在简化企业级应用开发。它提供了一个全面的编程模型,支持从Web到数据访问等各种应用需求。Spring的核心...
在默认配置下,每个数据库事务对应一个持久化上下文,即“Entity Manager per application transaction”模式。通过`@PersistenceContext`注入的EntityManager实际上是一个代理,它在事务的生命周期内管理数据库操作...
本文将详细解析Spring在JSP中的事务配置过程。 首先,理解事务管理的重要性。在数据库操作中,事务是一系列操作的集合,这些操作要么全部执行,要么都不执行,以保证数据的一致性。在分布式系统或并发环境中,事务...
Spring 中 @Import 的各种用法以及 ImportAware 接口详解 @Import 注解是 Spring 框架中一个非常重要的注解,它提供了和 XML 中 `<import/>` 元素等价的功能,实现导入的一个或多个配置类。@Import 即可以在类上...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式控制事务的边界。本文将详细解析Spring事务配置的多种方法,包括XML配置和注解方式。 首先,理解Spring事务配置的基本组件至关重要。...
### Struts + Spring + iBatis 配置详解 #### 一、概述 在实际的软件开发项目中,为了提高代码的复用性与维护性,通常会采用一系列的框架来构建应用程序。其中,Struts、Spring 和 iBatis 是三个非常流行且互补的...
4. **事务管理(Transaction Management)**:Spring提供了声明式和编程式的事务管理。在源码中,`PlatformTransactionManager`和`@Transactional`注解是核心概念,前者定义了事务管理的策略,后者则在方法级别声明...
### Spring多数据源配置详解 在企业级应用中,尤其是微服务架构下,多数据源配置成为了一项常见的需求。Spring框架提供了灵活且强大的机制来处理这种场景,使得开发者能够在一个应用中集成多个数据源,从而实现数据...
Spring事务Transaction配置的五种注入方式详解 Spring框架中的事务管理是通过TransactionManager来实现的,TransactionManager是Spring事务管理的核心组件。Spring提供了多种方式来配置事务,下面将详细介绍Spring...
根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...
- **功能简介**:包含了 Spring DAO、Spring Transaction 进行数据访问的所有类。 - **应用场景**:适用于需要进行数据访问操作的项目。 - **依赖关系**:依赖于 `spring-core.jar`、`spring-beans.jar`、`spring-...
### Spring 1.2 的 JDBC 配置详解 在 Spring 框架 1.2 版本中,对 JDBC 的支持已经相当成熟,并且提供了非常便捷的方式来管理和配置数据库访问。下面将根据提供的 XML 配置文件来详细介绍 Spring 1.2 中如何配置 ...