一、Propagation (事务的传播属性)

  Propagation
:  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

  PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

  PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

  PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

  PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

  1: PROPAGATION_REQUIRED

  加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务

  比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED,
那么由于执行ServiceA.methodA的时候,

  ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA

  的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。

  这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被

  提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚

  2: PROPAGATION_SUPPORTS

  如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行

  3: PROPAGATION_MANDATORY

  必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常

  4: PROPAGATION_REQUIRES_NEW

  这个就比较绕口了。
比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,

  那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,

  他才继续执行。他与PROPAGATION_REQUIRED
的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在

  两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,

  如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

  5: PROPAGATION_NOT_SUPPORTED

  当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED
,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,

  那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。

  6: PROPAGATION_NEVER

  不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED,
而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,

  那么ServiceB.methodB就要抛出异常了。

  7: PROPAGATION_NESTED

  理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,

  而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。

  而Nested事务的好处是他有一个savepoint。

  

  ServiceA {

   /**

   * 事务属性配置为 PROPAGATION_REQUIRED

   */

   void methodA() {

   try {

   //savepoint

   ServiceB.methodB(); //PROPAGATION_NESTED 级别

   } catch (SomeException) {

   // 执行其他业务, 如 ServiceC.methodC();

   }

   }

   }

  也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如

  ServiceC.methodC,继续执行,来尝试完成自己的事务。

  但是这个事务并没有在EJB标准中定义。

  Spring事务的隔离级别

  1. ISOLATION_DEFAULT:
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

  另外四个与JDBC的隔离级别相对应

  2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。

  这种隔离级别会产生脏读,不可重复读和幻像读。

  3. ISOLATION_READ_COMMITTED:
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

  它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

  5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

  除了防止脏读,不可重复读外,还避免了幻像读。

  什么是脏数据,脏读,不可重复读,幻觉读?

  脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,

  另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一

  个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

  不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。

  那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据

  可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

  幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及

  到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,

  以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

spring的事务传播属性的更多相关文章

  1. Spring的事务传播属性,数据库的隔离级别

    Spring事务的传播属性  REQUIRED 业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务.这是spring默认的传播行为. SUPPO ...

  2. spring的事务传播行为与隔离级别

    具体请参考blog:https://bbs.csdn.net/topics/391875990 要明白2个概念: 1.“spring的事务传播属性” 2.“spring的事务隔离级别” 例如正常的sp ...

  3. Spring支持的常用数据库事务传播属性和隔离级别

    事务的四大特征:原子性,隔离性,持久性,一致性 spring提供了7种事务传播属性: 一个事务与其他事务的隔离程度称为隔离级别.不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性 ...

  4. Spring事务传播属性有那么难理解吗?

    学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性. 传播属性 传播属性定义的是当一个事务方法碰到另一个事 ...

  5. spring事务传播属性和隔离级别

    猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程   1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...

  6. Spring事务传播属性

    Spring 对事务控制的支持统一在 TransactionDefinition 类中描述,该类有以下几个重要的接口方法: int getPropagationBehavior():事务的传播行为 i ...

  7. spring常用的事务传播属性说明

    事务Transaction,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被 ...

  8. 实例详解 EJB 中的六大事务传播属性--转

    前言 事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit).在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序.它有通常被称为 ACI ...

  9. 尚硅谷面试第一季-08Spring支持的常用数据库事务传播属性和事务隔离级别

    目录结构: 关键代码: BookShopServiceImpl.java package Spring支持的常用数据库事务传播属性和事务隔离级别.tx.service.impl; import Spr ...

随机推荐

  1. JPA调用函数

    criteriaBuilder.function("udf_get_cc_userright", Integer.class, criteriaBuilder.literal(se ...

  2. 全排列12 · Permutations

    无重复 [抄题]: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have ...

  3. 【转】Https内部机制基础知识

    互联网权威机构 - CA 机构,又称为证书授权 (Certificate Authority) 机构,浏览器会内置这些"受信任的根证书颁发机构" (即 CA). 数字证书 提及 H ...

  4. vue2.0学习小列子

    参考地址:https://segmentfault.com/a/1190000006165434 例1: <template> <div id="app"> ...

  5. The server is busy, please refresh

  6. 用 npm 安装删除模块

    npm安装模块 [npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录: [npm install -g xxx]利用npm安装全局模块xxx: 本地安装时将模块写入pac ...

  7. php连接mssql

    首先修改php.ini,将下行的前的分号去掉. extension=php_mssql.dll 由于本机没有安装客户端,所以要将ntwdblib.dll复制到C:\WINDOWS\system32目录 ...

  8. KBMMW 4.83.00 发布

    新版本又来了,端午节都不让大家过好:) 这次终于支持ios 64了,不用我再手工改了. Components4Developers is a company established in 1999 w ...

  9. idea开发工具下报Set language level to 6-@Override in interfaces的解决方法

    idea开发工具下报Set language level to 6-@Override in interfaces的解决方法 实现接口时报如下错误:Set language level to 6-@O ...

  10. 2081.09.22 Kuma(非旋treap)

    描述 有N张卡片,编号从0到n-1, 刚开始从0到n-1按顺序排好. 现有一个操作, 对于p. l,表示从第p张卡片之后的l张卡片拿到 最前面. 例如n=7的时候, 刚开始卡片序列为0 1 2 3 4 ...