参考连接: MySQL事务隔离级别和实现原理(看这一篇文章就够了!) - 知乎
参考连接: 【Spring学习34】Spring事务(4):事务属性之7种传播行为_程序老兵的博客-CSDN博客
事务: 一组数据操作, 要么全部成功, 要么全部失败
ACID特性:
原子性(Actomicity): 事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行
一致性(Consistent): 在事务开始和完成时,数据都必须保持一致状态
隔离性(Isolation): 多个并发事务之间要相互隔离
持久性(Durable): 事务提交后, 对数据的改变是永久的
事务并发带来的问题:
幻读: 一个事务中多次读取了其他事务的提交, 导致每次读取数据不一致, insert操作
脏读: 读取了其他事务未提交的数据
不可重复读: 一个事务中, 不同时刻读取的数据可能不一致, update操作
隔离级别: 根据业务场景, 选择处理并发问题的方式
读未提交(READ UNCOMMITTED): 可以读未提交事务
读提交(READ COMMITTED): 可以读已提交事务(Oracle默认)
可重复读(REPEATABLE READ): 一个事务中, 多次读取都为刚开始读的值(MySQL默认)
串行化(SERIALIZABLE): 事务序列执行, 不并发执行
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 可能 | 可能 | 可能 |
读提交 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
Spring中传播行为: Spring中独有的特性, 事务方法被另一个事务方法调用时, 该如何运行
传播行为 | 说明 |
PROPAGATION_REQUIRED | 没有事务, 则新建事务, 存在事务, 则加入(默认) |
PROPAGATION_SUPPORTS | 存在事务, 加入, 否则以非事务执行 |
PROPAGATION_MANDATORY | 不存在事务, 抛出异常 |
PROPAGATION_REQUIRES_NEW | 存在事务, 挂起, 新建自己的事务 |
PROPAGATION_NOT_SUPPORTED | 存在事务, 挂起, 非事务执行 |
PROPAGATION_NEVER | 存在事务, 抛出异常 |
PROPAGATION_NESTED | 存在事务, 则在嵌套事务运行, 否则, 新建事务 |
PROPAGATION_NESTED: 外层事务的提交和回滚能够控制嵌内层事务,而内层事务报错时,可以返回原始savepoint,外层事务可以继续提交