Oracle DB的隔离级别和JDBC的TRANSACTION_NONE属性

时间:2014-07-15 21:26:42

标签: oracle jdbc

我正在尝试了解Oracle中的隔离级别。我有一个关于NONE隔离级别的问题。

我能理解其他4个案例及其含义。基本上每个都有一种锁,它可以应用于行或表,以锁定对其他事务的访问。我在代码中测试了这个,我看到在同一行上运行的其他事务上阻止了更新。

如果我将隔离级别设置为none,是否意味着如果有两个不同的进程写入数据库中的同一行,它会相互覆盖还是可能损坏数据?没有交易意味着什么?它有什么影响?

参考:http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html#transactions_data_integrity

2 个答案:

答案 0 :(得分:5)

您链接的文档一般会谈到RDBMS。 Oracle以特定方式(称为multiversion concurrency control或MVCC)进行设计,进一步限制了您有效使用的隔离级别。这在您的链接文档中暗示:

  

注意:JDBC驱动程序可能不支持所有事务隔离级别。如果驱动程序不支持调用setTransactionIsolation中指定的隔离级别,则驱动程序可以替换更高,更严格的事务隔离级别。如果驱动程序无法替换更高的事务级别,则会抛出SQLException。使用方法DatabaseMetaData.supportsTransactionIsolationLevel来确定驱动程序是否支持给定级别。

总而言之,在Oracle中,您只有两个有效的隔离级别:

  1. TRANSACTION_READ_COMMITTED
  2. TRANSACTION_SERIALIZABLE(和this does not work as you intuitively might think
  3. 要了解Oracle 实际做什么,您可以使用此映射:

    • TRANSACTION_NONE变为TRANSACTION_READ_COMMITTED
    • TRANSACTION_READ_UNCOMMITTED变为TRANSACTION_READ_COMMITTED
    • TRANSACTION_READ_COMMITTED变为TRANSACTION_READ_COMMITTED
    • TRANSACTION_REPEATABLE_READ变为TRANSACTION_SERIALIZABLE
    • TRANSACTION_SERIALIZABLE变为TRANSACTION_SERIALIZABLE

    <强>更新

    实际上这有点不对:javadoc says that you cannot set the isolation level to TRANSACTION_NONE。另请参阅this question

答案 1 :(得分:1)

JDBC是一种跨数据库API标准,是Oracle公司拥有的Java语言的一部分,它支持许多事务隔离级别,而Oracle公司所拥有的关系数据库Oracle则不支持这些级别。具体来说,Oracle数据库仅支持读取已提交和可序列化的事务隔离级别(Oracle文档还将讨论非标准的只读事务隔离级别,该级别实际上是可序列化的,无法进行更改)。因此,在Oracle中,您不能使用TRANSACTION_NONE隔离级别。

在支持TRANSACTION_NONE的数据库中,每个语句基本上都是它自己的事务 - 一旦语句成功完成,您的更改就会被提交。实际上,如果你有两个会话使用TRANSACTION_NONE修改同一行,那么最后发生的更新将会有所规定,但你不会破坏你的数据库。

没有事务的真正影响是将逻辑损坏引入数据变得非常容易。在经典案例中,您正在运营一个帐户为A和B的银行.A想要将100美元转移到B.为了做到这一点,您通常会执行类似于一个DML语句的操作来记录从中删除100美元的交易一个帐户和第二个DML语句,用于记录向B&#39帐户添加100美元的交易。但是,如果你不在交易中做到这一点,最终你会遇到第一个陈述成功的情况,A发现自己差100元,而第二个陈述失败,B发现自己没有更富裕,100美元已经从你的银行神奇地消失了。这是逻辑腐败,因为您可以查看事务历史记录并得出结论出现问题,但在您的数据库不知道当前值是什么或不能对数据进行操作的情况下,它不会损坏。< / p>