ITPub博客

首页 > 数据库 > Oracle > [ORACLE] 脏读、不可重复读、幻读和隔离级别

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

原创 Oracle 作者:老虎跳龙门 时间:2021-03-28 17:20:00 0 删除 编辑

脏读:事务读取到了其他事务修改,但是未提交的行,就叫做脏读。

不可重复读(模糊读):事务读取之前曾经读取到的数据,发现该数据已经被另一个已经提交的事务修改或者删除了,就叫做不可重复读。

幻读:事务运行满足某个搜索条件的查询,发现另一个已提交的事务已经插入了满足条件的其他的行。


举例:

表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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: [ORACLE] SQL执行
请登录后发表评论 登录
全部评论

注册时间:2021-03-22

  • 博文量
    7
  • 访问量
    4403