事务的四个特性(ACID)
原子性
事务执行开始之后的一系列操作都堪称是一个原子操作,要么全部做完,要么全部失败,不能出现部分操作成功的情况。“原子”顾名思义,就是一个不可分割的最小单元。一致性
事务开始执行之后,数据的正确性需要得到保证。如A向B转账,B却未收到钱。隔离性
同一时间只能由一个事务对数据进行修改操作,对于其他事务来说这个修改操作时透明的。持久性
事务对数据进行修改操作完成之后,数据发生的改变是持久不变的,不会自己恢复到改变之前的状态。
spring中的事务传播机制 以及事务隔离级别
在接口TransactionDefinition
中,定义了7种传播机制
1 | package org.springframework.transaction; |
各种传播机制和隔离级别详解
事务传播机制
事务传播机制 | 作用 |
---|---|
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 | 序列化读 即事务串行读取数据,性能最差,安全性最高,保证数据准确性 |