2010-08-06 32 views
6

我了解甲骨文阻断了一点 - 更新如何阻止其他更新,直到事务完成,怎么作家不阻止读取等阻塞,锁定和隔离级别之间的关系是什么?

我明白了悲观和optimisic锁的概念,对典型的银行课本上的例子丢失丢失的更新等。

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

但是,我对这些概念是如何相互关联和相互作用有些模糊。例如:

  • 是Oracle提供默认悲观或 乐观锁(它 似乎只是阻止基于实验的独立 更新两个 蟾蜍会议。)
  • 如果像我怀疑,这些是 应用程序级别的概念,为什么会 当我可以让 数据库同步事务 无论如何更新时,我去实施一个 锁定策略的麻烦?
  • 当我的应用程序之外的其他客户端使用不同的隔离级别访问时,事务隔离级别(我在连接上设置的级别)如何改变数据库行为。

任何单词来澄清这些话题将非常感激!

+0

有几个问题(特别是不同客户端之间的影响)可能会在这里得到解答:http://en.wikipedia.org/wiki/Isolation_%28database_systems%29 – 2010-08-06 17:53:20

回答

3
  • Oracle允许使用任何一种类型的锁定 - 您如何构建应用程序会决定使用什么。回想起来,这不是一个真正的数据库决策。

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

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

我强烈建议您阅读Tom Kyte的优秀着作“专家Oracle数据库架构”,其中对这些和其他主题进行了相当清楚的阐述。

+0

Oracle确实具有不同的隔离级别和不同的行为。例如,serilizable可能会导致提交时发生“无法serilize事务”错误,这在正常隔离级别中不会出现。 – 2010-08-06 20:15:46

+0

这是我意识到的唯一例外,它不常用。如果你需要使用它,那么你需要知道这一点。Oracle的多版本实现负责处理其他ANSI隔离级别。 – DCookie 2010-08-06 21:55:31

2

乐观锁定基本上是“我只在修改数据时锁定数据,而不是在读取数据时”。问题是,如果你没有立即锁定数据,其他人可以在你做之前改变它,并且你正在查看旧的新闻(并且可以盲目地覆盖读取数据和更新数据之间发生的变化。 )

悲观锁定是在您读取数据时锁定数据,以便您确定没有人更改它,如果您决定更新它。

这是一个应用决定,而不是一个Oracle决定:

SELECT的x,y,z的表1,其中A = 2

不会锁定匹配的记录,但

选择x, y,z FROM table1 WHERE a = 2 FOR UPDATE

will。所以,你必须决定,如果你确定与乐观锁

SELECT x, y, z FROM table1 WHERE a = 2 

...久而久之...

UPDATE table1 
    SET x = 1, y = 2, z = 3 
WHERE a = 2 

(你可能会改写的变化有人在此期间其他人发出)

或需要悲观:

SELECT x, y, z FROM table1 WHERE a = 2 FOR UPDATE 

...久而久之...

UPDATE table1 
    SET x = 1, y = 2, z = 3 
WHERE a = 2 

(你确定你既然问,它没有一个改变了的数据。)

入住这里在Oracle提供的隔离级别。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm#CNCPT621

1

Oracle ALWAYS处理悲观锁定。也就是说,它会在更新时锁定一条记录(如果涉及到某个关键字,也可以打锁来删除和插入)。您可以使用SELECT .... FOR UPDATE来增加悲观锁定策略。

事实上任何工作的数据库/存储引擎都必须执行某种形式的锁定。

SERIALIZABLE隔离级别更接近乐观锁定机制。如果事务尝试更新自事务开始以来已更新的记录,它将引发异常。但是它依赖于数据库会话和最终用户会话之间的一对一。由于连接池/无状态应用程序变得流行,特别是在用户活动繁重的系统中,数据库会话长时间连接可能是一种糟糕的策略。优先锁定是首选,Oracle的更高版本通过ORA_ROWSCN和ROWDEPENDENCIES项目支持此功能。基本上,他们可以更容易地查看自最初/最后一次查看记录以来是否更改过记录。由于数据库会话和用户会话之间的一对一关系已经成为传统,因此应用程序层已经保留了更多的“用户会话”状态,因此更加负责检查用户的选择在5分钟/ 10分钟之前仍然有效(例如,该书仍然存在,或者是否有其他人购买它)。

相关问题