脏读、不可重复读、幻读:
脏读:当前事务读到的数据是别的事务想要提交的但是没有提交成功的数据,换一种描述即读取到了别的事物回滚撤销前的数据。
如事务A执行过程中修改了数据C,提交前,事务B读取了数据C,此时事务A回滚了,这样事务B就变成了脏读。
不可重复读:同一事务多次读取同一条数据,发现数据变更(可能是别的事物修改了),就是所谓的不可重复读。
幻读:当前事务进行一次查询数据比之后读取到的数据少了,期间可能是别的别的事物操作了数据,产生了更多满足条件的数据。
事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
不可重复读和幻读比较:
两者有些相似,但是前者针对的是update或delete,后者针对的insert。
Spring中使用了注解进行标识对应的隔离级别 isolation= Isolation.READ_COMMITTED
@Override
@Transactional(isolation= Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public Role getRole(Long id) {
// TODO Auto-generated method stub
return null;
}
对应的隔离级别有:
spring(数据库)事务隔离级别分为四种(级别递减):
1、Serializable (串行化):最严格的级别,事务串行执行,资源消耗最大;
2、REPEATABLE READ(重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。
3、READ COMMITTED (提交读):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。
4、Read Uncommitted(未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
参考:
https://blog.csdn.net/Somhu/article/details/78775198 通俗地解释脏读、不可重复读、幻读