Spring 框架中对于事物的管理,主要定义了一下四种属性:

  • 事物的隔离(Isolation)级别
  • 事物的传播行为(Propagation Behavior)
  • 事物的超时时间(TImeout)
  • 是否为只读(ReadOnly)

事物的隔离级别又有以下5个常量用于标志可供选择的隔离级别:

  • ISOLATION_DEFAULT:如果指定隔离级别为 ISOLATION_DEFAULT,则表示使用数据库默认的隔离级别,通常情况下是 Read Committed。
  • ISOLATION_READ_UNCOMMITTED:对应 Read Uncommitted 隔离级别,无法避免脏读,不可重复读和幻读。
  • ISOLATION_READ_COMMITTED:对应 Read Committed 隔离级别,可以避免脏读,但无法避免可重复读和幻读。
  • ISOLATION_REPEATABLE_READ:对应 Repeatable Read 隔离级别,可以避免脏读和不可重复读,但不能避免幻读。
  • ISOLATION_SERIALIZABLE:对应 Serialization 隔离级别,可以避免所有的脏读,不可重复读以及幻读,但并发性效率最低。

事物的传播行为,有以下7种:

  • PROPAGETION_REQUIRED:如果当前存在一个事务,则加入当前事务。如果不存在任何事务,则创建一个新的事务。总之,要至少保证在一个事务中运行。Required 通常作为默认的事务传播行为。
  • PROPAGETION_SUPPORTS:如果当前存在一个事务,则加入当前事务。如果当前不存在事务,则直接执行。对于一些查询方法来说,那么不需要事务的支持。如果当前方法被其他方法调用,而其他方法启动了一个事务,使用 Supports 可以保证当前方法能够加入当前事务,并洞察当前事务对数据资源所做的更新。
  • PROPAGETION_MANDATORY:mandatory 强制要求当前存在一个事务,如果不存在,则抛出异常。如果某个方法需要事务支持,但自身又不管理事务提交或者回滚,那么比较适合使用 mandatory。
  • PROPAGETION_REQUIRES_NEW:不管当前是否存在事务,都会创建新的事务。如果当前存在事务,会将当前事务挂起(Suspend)。如果某个业务对象所做的事务不想影响到外层事务, requires_new 应该是合适的选择。比如,假设当前的事务方法需要向数据库中更新写日志信息,但是指这些日志信息更新失败,我们也不想因为该业务方法的事务回滚,而影响到外层事务的成功提交。因为这种情况下,当前业务方法的事务成功与否对外层事务来说无关紧要。
  • PROPAGETION_NOT_SUPPORTED:不支持当前事务,而是在没有事务的情况下执行。如果当前存在事务的话,当前事务原则上将被挂起(Suspend)。
  • PROPAGETION_NEVER:永远不需要当前存在事务,如果存在事务,则抛出异常。
  • PEOPAGETION_NESTED:如果存在当前事务,则在当前事务的一个嵌套事务中执行,否则与 PROPAGETION_REQUIRED 的行为类似,即创建新的事务,在新创建的事务中执行。Nested 粗看起来好像与 PROPAGETION_REQUIRES_NEW 创建的新事务与外层事务属于同一个 “档次”,即二者的地位是相同的。当新创建的事务运行的时候,外层事务将被暂时挂起。而 Nested 创建的嵌套事务则不然,它是寄生于当前外层事务的,它的地位比当前外层事务的地位要小一号。当内部嵌套事务运行的时候,外层事务也是出于 active 状态,如下图涉及的多个事务相互之间的地位。

注意:

1. REQUIRES_NEW 传播行为中,外层事务抛出异常,不会影响内部事务。外部事务的异常会影响外层事务。

2. MyBatis 不支持 NESTED 传播行为,最好不使用。

Spring 事物隔离级别,事物传播行为的更多相关文章

  1. Spring事务隔离级别和传播特性

    相信每个人都被问过无数次Spring声明式事务的隔离级别和传播机制吧!今天我也来说说这两个东西. 加入一个小插曲, 一天电话里有人问我声明式事务隔离级别有哪几种, 我就回答了7种, 他问我Spring ...

  2. Spring事务隔离级别和传播特性(转)

    相信每个人都被问过无数次Spring声明式事务的隔离级别和传播机制吧!今天我也来说说这两个东西. 加入一个小插曲,一天电话里有人问我声明式事务隔离级别有哪几种,我就回答了7种,他问我Spring的版本 ...

  3. Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理

    原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...

  4. spring事务隔离级别、传播机制以及简单配置

    转自 https://blog.csdn.net/zht741322694/article/details/78676964 一.spring支持的事务声明方式1.  编程式事务  当系统需要明确的, ...

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

    事务的隔离级别也分为四种: read uncommited(读未提交). read commited(读提交). read repeatable(读重复). serializable(序列化), 这四 ...

  6. spring事物传播机制 事物隔离级别

    Spring事务类型详解: PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PROPAGATION_SUPPORTS--支持当前事务,如 ...

  7. Spring事物隔离级别及事物传播行为@Transactional实现

    阅读本篇文章前,请先阅读如下文章: 四种事物隔离级别详解 先看下@Transactional可以配制那些参数及以其所代表的意义. isolation 枚举org.springframework.tra ...

  8. SQL事物隔离级别

    标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...

  9. 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

  10. 浅谈Spring的事务隔离级别与传播性

    浅谈Spring的事务隔离级别与传播性 这篇文章以一个问题开始,如果你知道答案的话就可以跳过不看啦@(o・ェ・)@ Q:在一个批量任务执行的过程中,调用多个子任务时,如果有一些子任务发生异常,只是回滚 ...

随机推荐

  1. springboot打war包汇总

    概述 第一次用maven工具打war包,出现各种各样的问题,做个问题记录方便下次查看 maven 一开始用的maven是springboot默认的,在.m2下,要打包时才发现没有mvn指令.索性自己就 ...

  2. .Net 获取当前周是第几周

    最近项目中需要获取当前周是今年的第几周,这东西听起来不难,但是还挺有意思的. 在中国,一周是从周一开始算,周天结束,在国外就不是这样了,是从周天到周六为一个周. 有很多种方式去实现在这个功能,下面介绍 ...

  3. C# winform中组合键奇怪不响应问题

    再winform中使用ProcessCmdKey处理快捷键响应,针对单一快捷键响应没有任何问题.但是针对组合键总是无法响应,如下: protected override bool ProcessCmd ...

  4. Java中关于位运算的面试题

    位运算的效率是最高的,因为位位运算是直接对二进制进行操作 位运算只能应用于整型和char类型(char类型可以看做是特殊的无符号的整形) 面试题: a: 判断一个数是否是奇数 a & 1 == ...

  5. QML官方文档:Qt Quick Controls 1和2对比

    Qt Quick Controls有1和2两个版本,在程序中会看到好多1和2版本混合使用的情况. 原文:https://doc.qt.io/qt-5/qtquickcontrols2-differen ...

  6. 【转载】Gradle学习 第六章:构建脚本基础

    转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ...

  7. <Android Studio> 2.APP开机启动

    开机启动,也就是App随着机器开机而启动,在很多工业场景中是非常常见的. 开机启动的基本原理就是监听系统启动相关的广播,然后启动App. 为了实现开机启动,我人为的分为几个步骤 1.创建broadca ...

  8. HP服务器重装centeos 6.3红屏错误码 Illegal Opcode

    公司组装一个服务器要装centos 6.3 .出现一个问题 如果自动引导一切正常.如果手动分区重启后就会,红屏错误码 Illegal Opcode. 去网上问度娘各种不靠谱,有时说要 升级BIOS,从 ...

  9. Java只有值传递(Java值传递还是引用传递?)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830521.html 一:区分Java数据类型.变量类型 Java数据类型分两种:基本数据类型.引用类型. ...

  10. MySQL数据物理备份之lvm快照

    使用lvm快照实现物理备份 优点: 几乎是热备(创建快照前把表上锁,创建完后立即释放) 支持所有存储引擎 备份速度快 无需使用昂贵的商业软件(它是操作系统级别的) 缺点: 可能需要跨部门协调(使用操作 ...