Sping的事务 和 数据库的事务是不同的概念,数据库的事务一般称为底层事务

Spring的事务是对这种事务的抽象 我称之为逻辑事务

Spring对事务的功能进行了扩展,除了基本的Isolation之外,增加了PROPAGATION传播特性,Timeout属性,readOnly属性 ,回滚条件

Isolation是作用于物理属性的

PROPAGATION传播特性 是通过spring自己的事务管理实现的事务嵌套的处理逻辑

Timeout属性,readOnly属性 则都是作用于Connection上的

下面我把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是否是不回滚的异常类型
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Spring中事务的5种属性总结的更多相关文章

  1. spring对数据库的操作、spring中事务管理的介绍与操作

    jdbcTemplate的入门 创建maven工程 此处省略 导入依赖 <!-- https://mvnrepository.com/artifact/org.springframework/s ...

  2. Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现

    Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细,本来是想在源码分析的文章中附带讲一讲事务使用中的 ...

  3. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  4. Spring中bean的四种注入方式

    一.前言   最近在复习Spring的相关内容,这篇博客就来记录一下Spring为bean的属性注入值的四种方式.这篇博客主要讲解在xml文件中,如何为bean的属性注入值,最后也会简单提一下使用注解 ...

  5. 【面试普通人VS高手系列】Spring中事务的传播行为有哪些?

    一个工作了2年的粉丝,私信了一个比较简单的问题. 说: "Spring中事务的传播行为有哪些?" 他说他能记得一些,但是在项目中基本上不需要配置,所以一下就忘记了. 结果导致面试被 ...

  6. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  7. spring中bean的五种作用域?Spring中的bean是线程安全的吗?

    spring中bean的五种作用域 当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleto ...

  8. spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

    一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2.事务配置实例 (1).spring+mybatis 事务配置 &l ...

  9. Spring中事务管理的两种方式

    spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务 ...

随机推荐

  1. Away3d 基础 1 ---对一个简单类的解释

    转自:http://www.cnblogs.com/nooon/archive/2009/05/16/1458334.html 原英文地址: http://www.flashmagazine.com/ ...

  2. Ubuntu配置Android编译环境

    1.Ubuntu安装 VMware安装ubuntu之后,安装Vmware tools: 1.安装完ubuntu后,VMware Workstation菜单:虚拟机-->安装 Vmware Too ...

  3. AIX项目总结_oracle_sqlloader_01

    近来一直在忙AIX的移行项目,但也因自己小小偷懒,所以到现在才开始记录.接下来,言归正传. 这个项目中,学习中了shell相关知识,从基本的语法命令(定义变量.特殊变量使用.循环控制.方法调用等)到l ...

  4. CF 294C(Java大数做计数)

    题目链接:http://codeforces.com/contest/294/problem/C 代码: import java.util.*; import java.math.*; public ...

  5. typeof和instanceof 运算符

    instanceof运算符与typeof运算符相似,用于识别正在处理的对象的类型,但是在使用 typeof 运算符时采用引用类型存储值会出现一个问题. 无论引用的是什么类型的对象,它都返回 " ...

  6. onethink加密解密函数

    onethink中封装的加密解密函数 <?php /** * 系统加密方法 * @param string $data 要加密的字符串 * @param string $key 加密密钥 * @ ...

  7. jquery.qrcode.min.js生成二维码 通过前端实现二维码生成

    主体代码: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <tit ...

  8. linux 环境下java环境配置

    vi + /etc/profile向文件里面追加以下内容:JAVA_HOME=/usr/local/java7JRE_HOME=/usr/local/java7/jrePATH=$PATH:$JAVA ...

  9. 怎样克服 JavaScript 框架疲劳?

    [编者按]Tero Parviainen 著有 Build Your Own AngularJS,曾两次组织 Clojure CUP 竞赛,在 Twitter 上有近两千名关注者. 在本文中.Tero ...

  10. 指纹增强程序Hong_enhancement

    本算法是基于Lin Hong et al 的论文“Fingerprint ImageEnhancement: Algorithm and Performance Evaluation”编写而成.其中一 ...