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
21
22
23
24
25
26
27
28
29
30
31
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; // 序列化读 即事务串行读取数据,性能最差,安全性最高,保证数据准确性
int TIMEOUT_DEFAULT = -1;

int getPropagationBehavior();

int getIsolationLevel();

int getTimeout();

boolean isReadOnly();

String getName();
}

陈年风楼 wechat
本不想放微信的,如果有转账的需求,请加我好友~哈哈