`

Spring事务的5个属性

阅读更多

 

在spring中 事务有5个属性

  1. 传播特性
  2. 隔离级别
  3. 回滚规则
  4. 事务超时
  5. 是否只读
除了回滚规则外 其他的属性都定义在TransactionDefinition的实现类里面
一般来讲 就是DefaultTransactionDefinition了
 
回滚规则的判断体现在接口TransactionAttribute里面 实现则是在RuleBasedTransactionAttribute里面
 
 

1.传播特性PROPAGATION:
新的事务应该被启动还是挂起?方法是否要在事务的环境中运行?
  • PROPAGATION_MANDATORY  方法必须在事务中运行,如果没有事务就要抛出错误 MANDATORY 是强制的意思
  • PROPAGATION_NESTED   嵌套,外层有事务的情况下 如果内层要打开事务就打开事务嵌套运行,如果内层没有事务就加入到上层事务中去,嵌套事务是可以独立提交和回滚的 (对于jdbc Spring其实在内层没有开启新事务,只是在内层方法前设置了savepoint)
  • PROPAGATION_NEVER  表示这个方法不能运行在事务中,如果上下文有事务 就要抛出异常
  • PROPAGATION_NOT_SUPPORTED 表示当前方法运行的时候 如果有上下文事务,那么上下文事务会被挂起 等该方法执行结束,上下文事务恢复
  • PROPAGATION_REQUIRED  表示当前方法必须运行在事务中,如果上下文有事务就加入上下文事务;上下文没有事务,就启动一个新事务
  • PROPAGATION_REQUIRES_NEW  当前方法一定会启动自己的事务,如果有上下文事务,上下文事务会被挂起的 (对于jdbc  Spring在内层开启新事务(创建了新的Connection  内层事务是独立的开启 提交 回滚的)
  • PROPAGATION_SUPPORTS 表示当前方法不需要上下文事务,但是如果有上下文事务的话 还是可以在上下文事务里运行的

2.隔离级别ISOLATION
一个事务,可能受其他并发事务的影响程度
 
3个问题:
脏读:    事务A在执行过程中 读取到了事务B修改过但是尚未提交的数据
不可重复读:    事务A读取了两次,两次结果不同, 原因是中途事务B修改了数据并且提交了
幻读:    事务A读取了3行数据  过了一会再读取读出来4条数据,  原因是事务B中途insert了一条数据;  多出来的这一条数据叫做幻影数据
 
  • ISOLATION_DEFAULT 数据库默认隔离级别  mysql的话 就是read_committed
  • ISOLATION_READ_UNCOMMITTED  读未提交 会导致脏读, 但是也是效率最高的一种级别
  • IOSLATION_READ_COMMITTED  读已提交,最常用的的级别,可以防止脏读
  • ISOLATION_REPEATABLE_READ  可重复读, 能防止脏读和重复读, 但是防不了幻读
  • ISOLATION_SERIALIZABLE   最高级别,可防幻读

3.只读 readOnly
       private boolean readOnly = false;

	public final void setReadOnly(boolean readOnly) {
		this.readOnly = readOnly;
	}
	public final boolean isReadOnly() {
		return this.readOnly;
	}
 
 

4.事务超时  timeOut
    private int timeout = TIMEOUT_DEFAULT;

	public final void setTimeout(int timeout) {
		if (timeout < TIMEOUT_DEFAULT) {
			throw new IllegalArgumentException("Timeout must be a positive integer or TIMEOUT_DEFAULT");
		}
		this.timeout = timeout;
	}
	public final int getTimeout() {
		return this.timeout;
	}
 

5.回滚规则
        private List<RollbackRuleAttribute> rollbackRules;
	public void setRollbackRules(List<RollbackRuleAttribute> rollbackRules) {
		this.rollbackRules = rollbackRules;
	}
	public List<RollbackRuleAttribute> getRollbackRules() {
		if (this.rollbackRules == null) {
			this.rollbackRules = new LinkedList<RollbackRuleAttribute>();
		}
		return this.rollbackRules;
	}
      // 判断当前抛出的异常是否要回滚
	public boolean rollbackOn(Throwable ex) {
	 
		RollbackRuleAttribute winner = null;
		int deepest = Integer.MAX_VALUE;
		if (this.rollbackRules != null) {
			for (RollbackRuleAttribute rule : this.rollbackRules) {
				int depth = rule.getDepth(ex);
				if (depth >= 0 && depth < deepest) {
					deepest = depth;
					winner = rule;
				}
			}
		}
		if (logger.isTraceEnabled()) {
			logger.trace("Winning rollback rule is: " + winner);
		}
		// User superclass behavior (rollback on unchecked) if no rule matches.
		if (winner == null) {
			logger.trace("No relevant rollback rule found: applying default rules");
			return super.rollbackOn(ex);
		}
			
		return !(winner instanceof NoRollbackRuleAttribute);  //判断winner是否是不回滚的异常类型
	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0
4
分享到:
评论
1 楼 xn792474 2015-01-21  
什么垃圾文章

相关推荐

    Spring中事务的传播属性详解

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

    Spring事务传播属性

    Spring事务传播属性是这一机制的关键组成部分,它定义了在一个事务方法被另一个事务方法调用时,应该如何处理事务的边界。在深入理解Spring事务传播属性之前,我们首先需要了解Spring中的事务管理模型,包括编程式...

    Spring事务详细讲解

    Spring事务详细讲解 在 Spring 框架中,事务管理扮演着非常重要的角色。Spring 声明式事务让我们从复杂的事务处理中得到解脱,使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要...

    Spring事务小demo

    这个名为"Spring事务小demo"的项目提供了一个实践示例,帮助开发者了解Spring事务处理的基本概念和用法。 首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务...

    spring事务案例分析.zip

    本主题将深入探讨“Spring事务案例分析.zip”中的关键知识点,包括Spring事务管理及其在实际项目中的应用。 首先,我们来了解什么是Spring事务管理。在分布式系统或数据库操作中,事务管理是确保数据一致性和完整性...

    Spring事务管理的jar包

    本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...

    spring事务操作试验

    "spring事务操作主要对象.png"可能展示了Spring事务管理的关键组件,如TransactionDefinition(定义事务属性)、PlatformTransactionManager(事务管理器接口)、TransactionStatus(事务状态对象)等。这些对象协同...

    spring学习事务源码

    本文将深入探讨Spring事务管理的源码,理解其背后的实现机制。 首先,Spring事务管理有两种主要模式:编程式事务管理和声明式事务管理。编程式事务管理通过调用`PlatformTransactionManager`接口提供的方法进行显式...

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

    实验 spring 声明事务

    实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...

    spring事务详解

    在实际应用中,Spring事务管理的配置和使用需要注意以下几个方面: - 事务传播行为:定义了事务在遇到已有事务时的行为模式,例如是否加入当前事务、新建一个事务等。 - 事务隔离级别:定义了事务的隔离水平,例如...

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

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

    spring 事务基于注解模式

    Spring事务管理分为编程式和声明式两种。编程式事务管理通过编程的方式(如使用`TransactionTemplate`或直接调用`PlatformTransactionManager`)来控制事务的开始、提交、回滚等操作。而声明式事务管理则是在配置...

    Spring事务配置的五种方式

    下面将详细介绍这五个主要的事务配置方式。 1. **每个Bean都有一个代理** 在这种配置方式中,每个需要事务管理的Bean都会有一个事务代理。通过`TransactionProxyFactoryBean`创建代理,每个业务逻辑方法都将在事务...

    Spring事务测试题及原理

    此ppt中前半部分通过spring事务的60道题的测试,摸底对事务的掌握情况,后半部分,对spring中的事务属性(传播行为、隔离级别、回滚规则、事务超时、是否只读)进行说明

    Hibernate缓存与spring事务详解

    例如,通过Spring事务确保在一个事务内对多个对象的操作要么全部成功,要么全部失败,同时Hibernate的缓存减少对数据库的直接访问,提高系统性能。然而,合理配置缓存和事务策略以平衡性能和数据一致性是开发中的...

    Spring事务传播特性解析

    通过代码解析spring传播特性,包括 1、Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用... 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要JDBC3.0以上支持。

    spring事务配置的5中方式

    -- 配置事务属性 --&gt; *"&gt;PROPAGATION_REQUIRED,readOnly &lt;!-- 指向目标Bean --&gt; ``` 这里的`transactionAttributes`属性用于定义事务的传播行为和读写模式。 2. **基于注解的事务配置** - **使用@...

Global site tag (gtag.js) - Google Analytics