7个传播行为。4个隔离级别。

Spring事务的传播行为和隔离级别[transaction behaviorand isolatedlevel]

Spring中事务的定义:

Propagation(key属性确定代理应该给哪个方法添加事务行为。这种属性最重要的部份是传播行为。)有下面选项可供使用:

  • PROPAGATION_REQUIRED--支持当前事务,假设当前没有事务。就新建一个事务。

    这是最常见的选择。

  • PROPAGATION_SUPPORTS--支持当前事务,假设当前没有事务,就以非事务方式运行。
  • PROPAGATION_MANDATORY--支持当前事务,假设当前没有事务,就抛出异常。 
  • PROPAGATION_REQUIRES_NEW--新建事务,假设当前存在事务。把当前事务挂起。 
  • PROPAGATION_NOT_SUPPORTED--以非事务方式运行操作。假设当前存在事务,就把当前事务挂起。

  • PROPAGATION_NEVER--以非事务方式运行,假设当前存在事务,则抛出异常。

举例浅析Spring嵌套事务

  1. ServiceA {
  2.  
  3. void methodA() {
  4. ServiceB.methodB();
  5. }
  6.  
  7. }
  8.  
  9. ServiceB {
  10.  
  11. void methodB() {
  12. }
  13.  
  14. }
  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。





浅析Spring事务传播行为和隔离级别的更多相关文章

  1. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

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

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

  3. spring 事务传播特性 和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  4. spring事务传播机制与隔离级别、通知类别

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 说明 PROPAGATIO ...

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

    一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为. 有以下选项可供使用: PROPAGATIO ...

  6. spring事务传播性与隔离级别

    事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...

  7. spring事务和mysql的隔离级别

    mysql事务.mysql隔离级别.mysql锁.mysql数据一致性.Spring事务.Spring事务传播性之间的关系 一直有些模糊,整理一下.   mysql事务: 在mysql中,只有使用了I ...

  8. Spring的事务传播性与隔离级别以及实现事物回滚

    一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...

  9. spring事务之事务传播机制和隔离级别

    Spring事务传播行为 运用Spring事务,必须要深入理解它的传播机制,否则会遇到各种意想不到的坑,Spring定义了七种传播行为. public interface TransactionDef ...

随机推荐

  1. selenim之ActionChains(一)

    大家好,来介绍下,今天要分享的是小编学ActionChains的经验. 先来说一下今天要用到的方法: click(element=null)                               ...

  2. C#提取字符串中的数字字符串

    1               }

  3. 为什么选择使用Sass而不是Less?

    这篇文章主要解答以下几个问题,供前端开发者的新手参考. 1.什么是Sass和Less? 2.为什么要使用CSS预处理器? 3.Sass和Less的比较 4.为什么选择使用Sass而不是Less? 什么 ...

  4. 使用Recovery Services备份文件及文件夹

    1.创建恢复服务保管库 2.在backup项中选择本地,备份文件和文件夹选项 3.根据提示下载Agent及保管库凭据 4.在文件服务器上安装Agent 5.选择"继续注册"项,并添 ...

  5. 【手记】让Fiddler抓取入站请求,或者叫用Fiddler做反向代理

    注意:本文不涉及HTTPS的场景 最近在弄公众号开发,除了主动去调公众号接口,还存在公众号后台要反过来调你的情形,攻受转换一线间.对于回调的情况,想要知道对方是怎样来请求的很有必要.此前经常用Fidd ...

  6. TensorFlow简易学习[2]:实现线性回归

    上篇介绍了TensorFlow基本概念和基本操作,本文将利用TensorFlow举例实现线性回归模型过程. 线性回归算法 线性回归算法是机器学习中典型监督学习算法,不同于分类算法,线性回归的输出是整个 ...

  7. android堆栈调试--详细

    1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如: export PATH=$PATH:~/dlna/android ...

  8. 使用语句清除sqlserver数据库日志文件

    修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes I ...

  9. TypeScript入门,使用TypeScript编写第三方控件的方式!

    这是一篇新手篇的typescript插件编写方式!!!! 源码完整地址:https://gitee.com/dissucc/typescriptLearn 1.环境安装 node下载 下载地址:htt ...

  10. asp.net core 实现一个简单的仓储

    一直有自己写个框架的想法,但是一直没有行动起来,最近比较闲,正好可以开工了. 现在已经完成了两部分.1.一个简单仓储,实现使用的是ef 2.IOC部分,这里是把内置的ioc替换成了aotofac,这部 ...