Oracle数据库中READ_COMMITTED和SERIALIZABLE隔离级别之间的区别是什么?

时间:2014-12-01 11:57:00

标签: java oracle transactions

在阅读了很少有关交易的文件后,我现在完全糊涂了。我先解释一下我的情景。

我批量阅读需要大约3分钟才能从表中读取数据(SELECT)查询。同时另一个线程尝试执行INSERT / UPDATE / DELETE。这是一个错误,说" 无法获得交易" (因为我的数据源的默认事务是8(SERIALIZABLE))。

要允许INSERT / UPDATE / DELETE执行,我将事务设置为READ_UNCOMMITTED(根本没有锁定(读/写/范围))。但是当我执行我的程序时,它抛出一个错误,说只有支持的事务是READ_COMMITTED和SERIALIZABLE。

当我进一步调查时,我发现Oracle已经引入了事务隔离类型 快照 隔离,这实际上消除了可重复读取和脏读取事务期间数据库的em> snapshot ,通过提供一致的数据。

从上面的陈述我可以使用READ_COMMITTED的交易类型,但是维基百科在下面的陈述中完全混淆了我的理解:

  

快照隔离被称为"可序列化" Oracle中的模式[2] [3] [4]   和9.1之前的PostgreSQL版本,[5] [6] [7]可能导致   混淆了真正的可串行性"模式。有争论   支持和反对这一决定;很明显,用户必须   要注意区别,以避免可能出现的意外异常现象   他们的数据库系统逻辑中的行为。

所以现在我的问题是:

  1. 从Oracle角度来看,SERIALIZABLE和READ_COMMITTED有什么区别?
  2. 如果采用 snapshot 隔离,Oracle会抛出错误吗?对于两个不同的事务并更新同一条目会引发错误吗?
  3. 如果我的理解中有任何突破,请告诉我。

1 个答案:

答案 0 :(得分:3)

1.READ COMMITTED隔离级别:它是默认级别。每个查询(在事务内)只能看到在查询开始之前提交的数据。因此,如果您在同一事务中运行两次相同的查询,则可能会看到不同的结果和幻像。

SERIALIZABLE隔离级别:每个查询(在事务内)只能看到在事务启动之前提交的数据,以及在事务本身中进行的更改。所以,这里没有幽灵。

2.在Oracle快照隔离中称为 serializable 。所以,它是一回事。当可序列化事务尝试更新或删除由可序列化事务开始后提交的另一个事务修改的数据时,Oracle将抛出错误。

实际上,可以找到更多信息here