`

spring中的@Transaction配置详解

阅读更多

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中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...

    spring几种事务配置详解【精】

    本文将深入探讨Spring中的几种事务配置方式,帮助开发者更好地理解和运用。 1. **编程式事务管理** 编程式事务管理是在代码中显式调用事务API来控制事务的开始、提交、回滚等操作。这种方式直接在业务逻辑代码中...

    spring-transaction.jar.zip

    《Spring 事务管理详解》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的事务管理是其核心特性之一,对于保证应用程序数据的一致性和完整性至关重要。"spring-transaction.jar...

    Spring-Reference_zh_CN(Spring中文参考手册)

    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 提供了多种方式来配置事务管理,主要分为编程式事务管理和声明式事务管理。下面将详细介绍这...

    spring +hibernate 详解与配置(附图)

    ### Spring + Hibernate 详解与配置 #### Spring框架概述 Spring框架是一个开源的、轻量级的应用框架,旨在简化企业级应用开发。它提供了一个全面的编程模型,支持从Web到数据访问等各种应用需求。Spring的核心...

    Spring @Transactional工作原理详解

    在默认配置下,每个数据库事务对应一个持久化上下文,即“Entity Manager per application transaction”模式。通过`@PersistenceContext`注入的EntityManager实际上是一个代理,它在事务的生命周期内管理数据库操作...

    JSP 中spring事务配置详解.docx

    本文将详细解析Spring在JSP中的事务配置过程。 首先,理解事务管理的重要性。在数据库操作中,事务是一系列操作的集合,这些操作要么全部执行,要么都不执行,以保证数据的一致性。在分布式系统或并发环境中,事务...

    Spring中@Import的各种用法以及ImportAware接口详解

    Spring 中 @Import 的各种用法以及 ImportAware 接口详解 @Import 注解是 Spring 框架中一个非常重要的注解,它提供了和 XML 中 `&lt;import/&gt;` 元素等价的功能,实现导入的一个或多个配置类。@Import 即可以在类上...

    Spring 事务配置详解(多种配置方法)

    在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式控制事务的边界。本文将详细解析Spring事务配置的多种方法,包括XML配置和注解方式。 首先,理解Spring事务配置的基本组件至关重要。...

    struts+spring+ibaits配置详解

    ### Struts + Spring + iBatis 配置详解 #### 一、概述 在实际的软件开发项目中,为了提高代码的复用性与维护性,通常会采用一系列的框架来构建应用程序。其中,Struts、Spring 和 iBatis 是三个非常流行且互补的...

    spring源码中英文注释

    4. **事务管理(Transaction Management)**:Spring提供了声明式和编程式的事务管理。在源码中,`PlatformTransactionManager`和`@Transactional`注解是核心概念,前者定义了事务管理的策略,后者则在方法级别声明...

    Spring多数据源配置

    ### Spring多数据源配置详解 在企业级应用中,尤其是微服务架构下,多数据源配置成为了一项常见的需求。Spring框架提供了灵活且强大的机制来处理这种场景,使得开发者能够在一个应用中集成多个数据源,从而实现数据...

    Spring事务Transaction配置的五种注入方式详解

    Spring事务Transaction配置的五种注入方式详解 Spring框架中的事务管理是通过TransactionManager来实现的,TransactionManager是Spring事务管理的核心组件。Spring提供了多种方式来配置事务,下面将详细介绍Spring...

    spring声明式事务配置

    根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...

    spring jar 包详解

    - **功能简介**:包含了 Spring DAO、Spring Transaction 进行数据访问的所有类。 - **应用场景**:适用于需要进行数据访问操作的项目。 - **依赖关系**:依赖于 `spring-core.jar`、`spring-beans.jar`、`spring-...

    spring1.2的配置-jdbc

    ### Spring 1.2 的 JDBC 配置详解 在 Spring 框架 1.2 版本中,对 JDBC 的支持已经相当成熟,并且提供了非常便捷的方式来管理和配置数据库访问。下面将根据提供的 XML 配置文件来详细介绍 Spring 1.2 中如何配置 ...

Global site tag (gtag.js) - Google Analytics