0

根据这篇文章,可序列化的隔离级别对行执行读锁和范围锁。因此,如果在一个事务中我SELECT对某些行(或行)执行语句,则尝试查询相同行(或该行的子集)的另一个事务将锁定,直到第一个事务提交或回滚。正确的?但是在 oracle 中我尝试执行这样的场景并且第二个事务没有被锁定。为什么在我在第一个事务中执行提交之前它不会锁定?

4

2 回答 2

2

Oracle 采用多版本控制来保证读取一致性而不阻塞写入:

读一致性查询

查询返回的数据是提交的并且相对于单个时间点是一致的。

非阻塞查询

数据的读取者和写入者不会互相阻塞

当您在 Read-Committed 隔离中执行 SELECT 时,数据库会重建查询开始时的行,以便您拥有一致的数据视图(在同一时间点检索所有块)。Oracle 使用撤消数据来撤销查询开始对块所做的更改(以及来自其他未提交事务的更改)。

原理与可序列化事务隔离相同,只是 Oracle 将行重建为事务开始时的行。

为了进一步阅读,我建议您查看 Tom Kyte 的书中的“多版本和并发”一章。

于 2012-03-19T09:50:47.147 回答
0

Oracle 不采用读锁。他们有 CR 机制。

于 2012-03-19T03:59:11.887 回答