根据this,可序列化隔离级别对行执行读锁定和范围锁定。因此,如果在一个事务中我对某些行(或行)执行SELECT
语句,那么将尝试查询相同行(或该行的子集)的另一个事务将锁定,直到第一个进行提交或回滚。对?但是在oracle中我试图执行这样的场景并且第二次交易没有被锁定。为什么在我在第一次交易中执行提交之前它没有锁定?
答案 0 :(得分:2)
Oracle使用multiversionning来保证读取权限而不会阻止写入:
阅读一致性查询
查询返回的数据已提交并与之保持一致 到一个时间点。
非阻止查询
数据的读者和编写者不会相互阻止
当您在Read-Committed隔离中执行SELECT时,数据库会按照查询开头处的行重建这些行,以便您拥有一致的数据视图(所有块都在同一点检索到 - 时间)。 Oracle使用撤消数据来反转在查询开始后对块所做的更改(也包括其他未提交事务的更改)。
原则与可序列化事务隔离相同,只是Oracle在事务开始时重建行。
为了进一步阅读,我建议你看一下Tom Kyte的书中的“Multi-Versioning and Concurrency”章节。
答案 1 :(得分:0)
Oracle不接受读锁定。他们有CR机制。