阻塞,锁定和隔离级别之间有什么关系?

Bri*_*ian 6 java database oracle transactions isolation

我对Oracle阻塞有一点了解 - 更新如何阻止其他更新,直到事务完成,编写器如何阻止读取器等.

我理解悲观和优化锁定的概念,以及关于丢失丢失更新的典型银行教科书示例等.

我也理解JDBC事务隔离级别,例如,我们很高兴看到未提交的数据.

然而,我对这些概念如何相关和相互作用有点模糊.例如:

  • Oracle是否默认提供悲观或乐观锁定(它似乎只是基于两个TOAD会话中的实验来阻止单独更新.)
  • 如果我怀疑这些是应用程序级别的概念,那么当我可以让数据库同步事务更新时,为什么我会遇到实现锁定策略的麻烦?
  • 当我的应用程序以外的其他客户端使用不同的隔离级别访问时,事务隔离级别(我在连接上设置)如何改变数据库行为.

任何澄清这些主题的话都会非常感激!

DCo*_*kie 3

  • Oracle 允许任一类型的锁定 - 您构建应用程序的方式决定了所使用的内容。回想起来,这实际上并不是一个数据库决定。

  • 大多数情况下,Oracle 的锁定足以满足与数据库的有状态连接。在无状态应用程序(例如 Web 应用程序)中,您无法使用它。在这种情况下,您必须使用应用程序级锁定,因为锁定适用于会话。

  • 通常你不需要担心它。在 Oracle 中,读取器永远不会阻止写入器,写入器也永远不会阻止读取器。Oracle 的行为不会随着各种 ANSI 隔离级别的变化而改变。例如,Oracle中不存在“脏读”这样的事情。Tom Kyte 指出,允许脏读的精神是为了避免阻塞读,这在 Oracle 中不是问题。

我强烈建议您阅读 Tom Kyte 的优秀著作“Expert Oracle Database Architecture”,其中对这些主题和其他主题进行了非常清晰的阐述。