在阅读了很少有关交易的文件后,我现在完全糊涂了.我先解释一下我的情景.
我有一个批量读取,大约需要3分钟从表中读取数据(SELECT)查询.同时另一个线程尝试执行INSERT / UPDATE / DELETE.它抛出一个错误,说“无法获取事务”(因为我的数据源的默认事务为8(SERIALIZABLE)).
要允许INSERT / UPDATE / DELETE执行,我将事务设置为READ_UNCOMMITTED(根本没有锁定(读/写/范围)).但是,当我执行我的程序时,它抛出一个错误,说唯一支持的事务是READ_COMMITTED和SERIALIZABLE.
当我进一步调查时,我发现Oracle引入了事务隔离类型快照隔离,它通过在事务期间获取数据库的快照来实际消除可重复读取和脏读取,从而提供一致的数据.
从上面的语句我可以使用READ_COMMITTED的事务类型,但是维基百科到目前为止完全混淆了我的理解与下面的陈述:
Snapshot isolation is called “serializable” mode in Oracle[2][3][4]
and PostgreSQL versions prior to 9.1,[5][6][7] which may cause
confusion with the “real serializability” mode. There are arguments
both for and against this decision; what is clear is that users must
be aware of the distinction to avoid possible undesired anomalous
behavior in their database system logic.
所以现在我的问题是:
>从Oracle角度来看,SERIALIZABLE和READ_COMMITTED有什么区别?
>如果采用快照隔离并且两个不同的事务和更新相同的条目引发错误,Oracle是否会抛出错误?
>如果我的理解中有任何突破,请告诉我.