事务的四大特性/脏读、不可重复读、幻读?/spring事务的隔离级别与传播特性

四大特性(ACID)

  • 原子性(Atomic)一个事务要么全部执行成功,要么全部失败回滚,即要么全部做要么全不做
  • 一致性(Consistency)一个事物只能从一个一致状态变为另一个一致状态,可以理解为A和B两个账户进行转账,无论如何转,转账前后,他们账户的总额总是不变的,这就是一致状态。
  • 隔离性(Isolation)事物之间互不干扰
  • 持久性(Durability)当系统或介质发生故障是,需要确保已提交事物更新不能丢失。主要在于DBMS的恢复性能,例如InooDB的redo log 文件

事物隔离级别(MySql默认repeatable-read,oracle默认read-committed)

查看数据库的隔离级别SELECT @@tx_isolation;。默认隔离级别为REPEATABLE-READ
修改事物隔离级别,例如SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

脏读、不可重复读、幻读
1、更新丢失,mysql的所有事物隔离级别都能避免该问题
2、脏读(使用read-commited隔离级别可以解决):(读取到其他事物还没有提交的值)例如:事务1修改了数据,但是还没有提交,这时候被事务2读取了。此时事务1又回滚了,导致事务2读取的数据是脏数据。
3、不可重复读(使用repeatable-read隔离级别可以解决): 事务1两次读取数据,再此期间事务2对数据进行了修改,导致两次的数据不一致。
4、幻读(使用serializable隔离级别可以解决):事务1修改了全表的数据,然后又查询全表数据观察结果是否符合预期。但在查询之前事务2又插入了一条数据,导致事务1读取的数据还有一条没有被修改到,好像发生了幻觉一样。
事务的四大特性/脏读、不可重复读、幻读?/spring事务的隔离级别与传播特性_第1张图片

但是通过实际操作我们发现InnoDB引擎下的repeatable-read同样可以避免幻读

spring的事务

spring默认事务级别:使用数据库自己的隔离级别
事务的四大特性/脏读、不可重复读、幻读?/spring事务的隔离级别与传播特性_第2张图片
事务级别可通过如下方法设置
事务的四大特性/脏读、不可重复读、幻读?/spring事务的隔离级别与传播特性_第3张图片

spring事务的传播特性
spring事务的传播特性
1 required 支持当前事务,如果当前没有事务,则新建事务
如果当前存在事务,则加入当前事务,合并成一个事务
2 requires_new 新建事务,如果当前存在事务,则把当前事务挂起
这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交
3 nested 如果当前存在事务,它将会成为父级事务的一个子事务,方法结束后并没有提交,只有等父事务结束才提交
如果当前没有事务,则新建事务
如果它异常,父级可以捕获它的异常而不进行回滚,正常提交
但如果父级异常,它必然回滚,这就是和 REQUIRES_NEW 的区别
4 supports 和不写差不多. 有事务加入事务,没事务就没事务运行.
5 not_supported 以非事务方式运行, 有事务也挂起不用.
6 never 以非事务方式运行, 有事务就抛出异常,要求父级不能有事务.
7 mandatory 如果当前存在事务,则运行在当前事务中
如果当前无事务,则抛出异常,也即父级方法必须有事务

你可能感兴趣的:(数据库)