深入理解oracle的事务隔离性
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在Oracle关系数据库中,我们先来看下面这个问题: A事务:select <cols> from T where id > 10 and id < 10000; B事务:update T set id = 45000 where id = 4501 两个事务按下面的顺序执行: A事务:|--------------------------------|commit B事务: |-------------|commit 也就是A事务先开始执行,过一段时间B事务再开始执行,但是B事务先执行完并commit提交了,A事务又过了一段时间才完成。那么问题来了,在这种情况下,问A事务能不能取得正确的结果,两个事务之间会不会有干扰,怎么干扰? 这是一个典型的关系型数据库事务的隔离性问题,而且,针对不同的数据库(存储引擎),可能会有不同的表现。 根据上面的描述,以oracle为例,它的缺省数据库隔离级别是读已提交(read-committed),事务A持有一个读锁(瞬间共享读锁),B持有一个排它写锁。 Read Committed读已提交的官方定义是,通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 按照读已提交的定义,似乎按上题的条件,A