我正在努力理解Oracle中的隔离级别。我有一个关于无隔离度的问题。
我能理解其他4起案件以及这意味着什么。基本上,每个锁都有一种类型的锁,它被应用于行或表,以锁定对其他事务的访问。我在代码中对此进行了测试,并看到更新阻塞了运行在同一行中的其他事务。
如果我将隔离级别设置为none,是否意味着如果有两个不同的进程写入数据库中的同一行,则它们将相互覆盖或可能损坏数据?没有交易意味着什么?这会有什么影响呢?
参考文献:完整性
发布于 2014-07-15 21:41:18
链接到的文档一般都是关于RDBMS的。Oracle是以一种特定的方式(称为多版本并发控制或MVCC)设计的,它进一步限制了您有效地使用的隔离级别。这是在您的链接文档中暗示的:
备注:JDBC驱动程序可能不支持所有事务隔离级别。如果驱动程序不支持在调用
setTransactionIsolation中指定的隔离级别,则驱动程序可以替换更高、限制性更强的事务隔离级别。如果驱动程序无法替代更高的事务级别,则会抛出一个SQLException。使用DatabaseMetaData.supportsTransactionIsolationLevel方法确定驱动程序是否支持给定级别。
总之,在Oracle中只有两个有效的隔离级别:
TRANSACTION_READ_COMMITTEDTRANSACTION_SERIALIZABLE (和这不像你直觉上可能认为的那样有效。)要了解Oracle实际上在做什么,可以使用以下映射:
TRANSACTION_NONE变成TRANSACTION_READ_COMMITTEDTRANSACTION_READ_UNCOMMITTED变成TRANSACTION_READ_COMMITTEDTRANSACTION_READ_COMMITTED变成TRANSACTION_READ_COMMITTEDTRANSACTION_REPEATABLE_READ变成TRANSACTION_SERIALIZABLETRANSACTION_SERIALIZABLE变成TRANSACTION_SERIALIZABLE更新
实际上,这有点不对:无。另见这个问题
发布于 2014-07-15 21:39:21
JDBC是Oracle公司拥有的Java语言的一部分,是跨数据库API标准的一部分,它支持许多事务隔离级别,而Oracle公司拥有的关系数据库Oracle也不支持这些级别。具体来说,Oracle数据库只支持已提交和可序列化的事务隔离级别(Oracle文档还将讨论一个非标准的只读事务隔离级别,该级别实际上是可序列化的,不需要进行更改)。因此,在Oracle中,您不能使用TRANSACTION_NONE隔离级别。
在支持TRANSACTION_NONE的数据库中,每个语句本质上都是自己的事务--一旦语句成功完成,您的更改就会被提交。实际上,如果您有两个会话使用TRANSACTION_NONE修改同一行,那么最后发生的任何更新都将成为规则,但不会损坏数据库。
没有事务的真正影响是,在数据中引入逻辑损坏变得非常容易。在典型的情况下,您正在经营一家拥有帐户A和B.A的银行,您希望将100美元转移到B。为了做到这一点,您通常会执行类似于DML语句这样的操作,以记录从A帐户中删除100美元的事务,以及记录将100美元添加到B帐户的第二次DML语句。然而,如果你在交易中不这么做,最终你会遇到这样的情况:第一条语句成功了,而A发现自己更差100美元,而第二条语句失败了,B发现自己并不富裕,100美元神奇地从你的银行消失了。这是逻辑上的损坏,因为您可以查看事务历史并得出错误的结论,但从数据库的意义上来说,这不是不知道当前值的损坏,也不是无法对数据进行操作。
https://stackoverflow.com/questions/24768469
复制相似问题