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

Kar*_*sad 5 java oracle transactions

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

我有一个批量读取,大约需要3分钟从表中读取数据(SELECT)查询.同时另一个线程尝试执行INSERT/UPDATE/DELETE.它抛出一个错误,说" 无法获取事务 "(因为我的数据源的默认事务为8(SERIALIZABLE)).

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

当我进一步调查,我发现了甲骨文公司推出的事务隔离快照隔离这无形中消除重复读取和脏采取读快照给予一致的数据事务期间的数据库,在那里.

从上面的语句我可以使用READ_COMMITTED的事务类型,但是维基百科到目前为止完全混淆了我的理解与下面的陈述:

快照隔离在Oracle [2] [3] [4]和9.1之前的PostgreSQL版本中被称为"可序列化"模式[5] [6] [7],这可能会导致与"真正的可串行化"模式混淆.赞成和反对这一决定都有争议; 很清楚的是,用户必须意识到这一区别,以避免在他们的数据库系统逻辑中出现可能不希望的异常行为.

所以现在我的问题是:

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

ial*_*eev 8

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

SERIALIZABLE 隔离级别:每个查询(在事务内)只能看到在该事务开始之前提交的数据,以及事务本身所做的更改。所以,这里没有幻影。

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

实际上,可以在此处找到更多信息。