事务的ACID特性:
原子性是基础,隔离性是手段,持久性时目的这三个就是为了保证一致性
事务所面临问题:
- Dirty Read脏读:事务A读取了事务B未提交的数据,并在这个基础上做了其他修改
- Unrepeatable Read 不可重复读:事务A读取了事务B已提交的更改数据
- Phantom Read 幻读:事务A读取了事务B已提交的新增的数据
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ_UNCOMMITTED | √ | √ | √ |
READ_COMMITTED | × | √ | √ |
REPEATABLE_READ | × | × | √ |
SERIALIZABLE | × | × | × |
Spring的事务传播功能,7种:
前提:假设事务从方法A传播到方法B,用户需要面对方法B,问自己一个问题,方法A有事务吗?
propagation_required : 如果没有,就新建一个事务;如果有,就加入当前事务。,属于Spring的默认事务传播行为
propagation_requires_new:如果没有,就新建一个事务;如果有,就将当前事务挂起。就是创建一个新的事务,他和原来的事务没有任何关系了
propagation_nested:如果没有,就新建一个事务,如果有,就在当前事务中潜逃其他事务,也就是所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)
propagation_supports:如果没有,就以非事务方式执行;如果有,就使用当前事务。
propagation_not_supported:如果没有,就以非事务方式执行;如果有,就将当前事务挂起,这种方式非常强硬,没有就没有,有也不支持,挂起来,不管他。
propagation_never:如果没有,就以非事务方式执行;如果有,就抛出异常,这种方式更强硬,没有就没有,有了反而报错,从不支持事务
propagation_mandatory:如果没有,就抛出异常,如果有。就是用当前事务。 必须要有事务。
附加功能:
事务超时:
只读事务:
spring事务隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED)
读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化