【发布时间】:2015-01-29 10:18:08
【问题描述】:
在阅读了一些有关交易的文件后,我现在完全糊涂了。让我先解释一下我的场景。
我有一个批量读取,从表中读取数据 (SELECT) 查询大约需要 3 分钟。同时另一个线程尝试执行 INSERT/UPDATE/DELETE。它抛出一个错误,说“无法获取事务”(因为我的数据源的默认事务为 8 (SERIALIZABLE))。
为了允许 INSERT/UPDATE/DELETE 执行,我将事务设置为 READ_UNCOMMITTED(根本没有锁(读/写/范围))。但是当我执行我的程序时,它抛出了一个错误,说唯一支持的事务是 READ_COMMITTED 和 SERIALIZABLE。
当我进一步调查时,我发现 Oracle 引入了 事务隔离 类型的 snapshot 隔离,它通过采取 snapshot 事务期间数据库的快照,在那里提供一致的数据。
根据上述声明,我可以使用 READ_COMMITTED 的事务类型,但是到目前为止,维基百科完全混淆了我对以下声明的理解:
快照隔离在Oracle[2][3][4]中称为“可序列化”模式 和 9.1、[5][6][7] 之前的 PostgreSQL 版本,这可能会导致 与“真正的可序列化”模式混淆。有论据 支持和反对该决定;很明显,用户必须 注意区别以避免可能出现的不受欢迎的异常 数据库系统逻辑中的行为。
所以现在我的问题是:
- 从 Oracle 的角度来看,SERIALIZABLE 和 READ_COMMITTED 有什么区别?
- 如果采取快照隔离并且对于两个不同的事务和更新相同的条目会引发错误,Oracle 是否会引发错误?
- 如果我的理解有任何偏离,请告诉我。
【问题讨论】:
标签: java oracle transactions