首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle DB的隔离级别和JDBC的TRANSACTION_NONE属性

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

Stack Overflow用户
提问于 2014-07-15 21:26:41
回答 2查看 1.5K关注 0票数 0

我正在努力理解Oracle中的隔离级别。我有一个关于无隔离度的问题。

我能理解其他4起案件以及这意味着什么。基本上,每个锁都有一种类型的锁,它被应用于行或表,以锁定对其他事务的访问。我在代码中对此进行了测试,并看到更新阻塞了运行在同一行中的其他事务。

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

参考文献:完整性

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-15 21:41:18

链接到的文档一般都是关于RDBMS的。Oracle是以一种特定的方式(称为多版本并发控制或MVCC)设计的,它进一步限制了您有效地使用的隔离级别。这是在您的链接文档中暗示的:

备注:JDBC驱动程序可能不支持所有事务隔离级别。如果驱动程序不支持在调用setTransactionIsolation中指定的隔离级别,则驱动程序可以替换更高、限制性更强的事务隔离级别。如果驱动程序无法替代更高的事务级别,则会抛出一个SQLException。使用DatabaseMetaData.supportsTransactionIsolationLevel方法确定驱动程序是否支持给定级别。

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

  1. TRANSACTION_READ_COMMITTED
  2. TRANSACTION_SERIALIZABLE (和这不像你直觉上可能认为的那样有效。)

要了解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

更新

实际上,这有点不对:。另见这个问题

票数 6
EN

Stack Overflow用户

发布于 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美元神奇地从你的银行消失了。这是逻辑上的损坏,因为您可以查看事务历史并得出错误的结论,但从数据库的意义上来说,这不是不知道当前值的损坏,也不是无法对数据进行操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24768469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档