首页 > 数据库 > Oracle > [ORACLE] 脏读、不可重复读、幻读和隔离级别
脏读:事务读取到了其他事务修改,但是未提交的行,就叫做脏读。
不可重复读(模糊读):事务读取之前曾经读取到的数据,发现该数据已经被另一个已经提交的事务修改或者删除了,就叫做不可重复读。
幻读:事务运行满足某个搜索条件的查询,发现另一个已提交的事务已经插入了满足条件的其他的行。
举例:
表user (id int)
记录 1 2 3 4 5
事务A:
select * from user;
select * from user;
commit;
事务B:
delete from user where id=3;
commit;
事务C:
update user set id=100 where id=1;
commit;
事务D:
insert into user values (6);
commit;
场景1:
事务C已经执行,但还未提交,此时事务A的select * from user语句查出来的结果中存在100的记录而不存在1的记录,就是脏读。
场景2:
事务A执行第一个select语句查询到12345,此时事务B执行了并提交了,事务A的第二个select语句查询出来结果只剩下1245,和之前不一致,就是不可重复读。
场景3:
事务A执行了第一个select语句查到12345,此时事务D执行了并提交了,事务A的第二个select语句查询到的是123456
,和之前不一致,就是幻读。
ORACLE提供的隔离级别:
读提交隔离级别( Read Committed Isolation Level):
此隔离级别事务只读取到查询开始之前已经提交的事务,只保证查询过程中的数据读一致性,就是事务内多个查询可能会读取到不一致的数据,可能会遇到不可重复读和幻读。
在读提交隔离级别,若是事务A、B修改相同的行,事务A先修改获得行锁,则B事务会等待A事务提交,但A事务提交后B事务会接着执行,此时A事务对该记录的更新就丢失了。
可串行化隔离级别( Serializable Isolation Level):
此隔离级别事务只读取到事务开始之前已经提交的事务, 保证整个植物过程中的数据读一致性,不会遇到脏读、 不可重复读和幻读。
在 可串行化隔离级别, 若是事务A、B修改相同的行,事务A先修改获得行锁,则B事务会等待A事务提交,A事务提交后,B事务执行对该行的修改,发现该记录在B事务开始后被其他事务修改并提交过,此时数据库会报错, ORA-08177: Cannot serialize access for this transaction
只读隔离级别(
Read-Only Isolation Level):
只读隔离级别的事务和可串行化隔离级别类似,但不允许修改数据,一般用来生成报表。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69996961/viewspace-2765323/ ,如需转载,请注明出处,否则将追究法律责任。