Fork me on GitHub

事务传播机制和事务隔离级别

事务的四个特性(ACID)

  • 原子性
    事务执行开始之后的一系列操作都堪称是一个原子操作,要么全部做完,要么全部失败,不能出现部分操作成功的情况。“原子”顾名思义,就是一个不可分割的最小单元。

  • 一致性
    事务开始执行之后,数据的正确性需要得到保证。如A向B转账,B却未收到钱。

  • 隔离性
    同一时间只能由一个事务对数据进行修改操作,对于其他事务来说这个修改操作时透明的。

  • 持久性
    事务对数据进行修改操作完成之后,数据发生的改变是持久不变的,不会自己恢复到改变之前的状态。

spring中的事务传播机制 以及事务隔离级别

在接口TransactionDefinition中,定义了7种传播机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package org.springframework.transaction;

public interface TransactionDefinition {

// 事务传播机制
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;

// 事务隔离级别
int ISOLATION_DEFAULT = -1; // 默认级别
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
}

各种传播机制和隔离级别详解

事务传播机制
事务传播机制 作用
PROPAGATION_REQUIRED 默认的 也是最常用的 ,如果当前有事务,就加入当前这个事务,如果没有事务,就新建一个事务
PROPAGATION_SUPPORTS 如果有事务,就加入当前这个事务,如果没有事务,也不新建
PROPAGATION_MANDATORY 如果有事务,就会使用当前这个事务,如果没有就会抛出异常
PROPAGATION_REQUIRES_NEW 总是会开启一个新的事务,如果当前已经有事务,就将当前事务挂起
PROPAGATION_NOT_SUPPORTED 代码总是会在非事务的环境执行,如果当前有事务,先将事务挂起,执行完成之后再恢复
PROPAGATION_NEVER 绝对不允许代码在有事务的环境执行,有事务就抛出异常停止执行
PROPAGATION_NESTED 嵌套事务级别:如果没有父事务,就使用默认机制,如果有,子事务执行完成之后父事务才会提交
事务隔离级别
通俗名称 事务隔离级别 作用
脏读 ISOLATION_READ_UNCOMMITTED 读未提交 即脏读,可以读取别的事务已修改未提交的数据,会导致脏读、幻读和不可重复度
不可重复读 ISOLATION_READ_COMMITTED 提交读 即不可重复读,一个事物能读取到另一个事务已经提交的数据,在多次读取同一数据时,该数据被另一事务修改,读取的数据不一致
可重复读 ISOLATION_REPEATABLE_READ 可重复读 即一个事物只能读取到另一事务提交之前的数据,确保每次读取到的数据一致。但是数据又新增或者修改时不可预见
幻读 ISOLATION_SERIALIZABLE 序列化读 即事务串行读取数据,性能最差,安全性最高,保证数据准确性
陈年风楼 wechat
Add my WeChat, share tech-skills to each other 🙆‍