[ORACLE] 脏读、不可重复读、幻读和隔离级别

来源:这里教程网 时间:2026-03-03 16:34:47 作者:

脏读:事务读取到了其他事务修改,但是未提交的行,就叫做脏读。不可重复读(模糊读):事务读取之前曾经读取到的数据,发现该数据已经被另一个已经提交的事务修改或者删除了,就叫做不可重复读。幻读:事务运行满足某个搜索条件的查询,发现另一个已提交的事务已经插入了满足条件的其他的行。 举例:表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):         只读隔离级别的事务和可串行化隔离级别类似,但不允许修改数据,一般用来生成报表。

相关推荐