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

事务的ACID:

1.原子性(Atomictiy):事务开始后所有操作 要么全部做完 要么全部不做 不可能停滞在中间环节

2.一致性(Consistency):事务开始前和结束后 数据库的完整性约束没有被破坏  比如A向B转账 不可能A扣了钱 B却没收到

3.隔离性(Isolation):同一时间 只允许一个事务请求同一数据 不同的事务之间彼此没有任何干扰 比如A正在从一张银行卡中取钱 在A取钱的过程结束前 B不能向这张卡转账

4.持久性(Durability):事务完成后 事务对数据库的所有更新将被保存到数据库 不能回滚


事务并发产生的问题:

1、脏读:事务A读取了事务B更新的数据 然后B回滚操作 那么A读取到的数据是脏数据

2、不可重复读(多次读取的数据不同):事务 A 多次读取同一数据 事务 B 在事务A多次读取的过程中 对数据作了更新(修改)并提交 导致事务A多次读取同一数据时 结果不一致
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级 但是系统管理员B就在这个时候插入了一条具体分数的记录 当系统管理员A改结束后发现还有一条记录没有改过来 就好像发生了幻觉一样
不可重复读的和幻读很容易混淆 不可重复读侧重于修改 幻读侧重于新增或删除 

解决不可重复读的问题只需锁住满足条件的行 解决幻读需要锁表


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

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

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

* static int ISOLATION_DEFAULT  -- 采用数据库的默认隔离级别
* static int ISOLATION_READ_UNCOMMITTED  -- 允许读取尚未提交的修改 可能导致脏读 幻读和不可重复读
* static int ISOLATION_READ_COMMITTED  -- 允许从已经提交的事务读取 可防止脏读 但幻读 不可重复读仍然有可能发生
* static int ISOLATION_REPEATABLE_READ  -- 对相同字段的多次读取的结果是一致的 除非数据被当前事务自动修改 可防止脏读和不可重复读 但幻读仍有可能发生
* static int ISOLATION_SERIALIZABLE  -- 完全服从ACID隔离原则确保不发生脏读、不可重复读、和幻读 但执行效率最低

传播机制:
* 先解释什么是事务的传播行为:解决的是业务层之间的方法调用!!
* PROPAGATION_REQUIRED(默认值)-- A中有事务,使用A中的事务.如果没有 B就会开启一个新的事务 将A包含进来 (保证A B在同一个事务中) 
* PROPAGATION_SUPPORTS -- A中有事务 使用A中的事务 如果A中没有事务 那么B也不使用事务
* PROPAGATION_MANDATORY -- A中有事务 使用A中的事务 如果A没有事务 抛出异常
* PROPAGATION_REQUIRES_NEW -- A中有事务 将A中的事务挂起 B创建一个新的事务 (保证A,B没有在一个事务中)
* PROPAGATION_NOT_SUPPORTED -- A中有事务 将A中的事务挂起
* PROPAGATION_NEVER -- A中有事务 抛出异常

* PROPAGATION_NESTED -- 嵌套事务 当A执行之后 就会在这个位置设置一个保存点 如果B没有问题 执行通过 如果B出现异常运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)

https://yq.aliyun.com/articles/48893