服务器 频道

Oracle是如何判断锁的

  【IT168 服务器学院】 Ask Tom之中英对照20051215——Oracle是如何判断锁的

  
Venkat

  Oracle是如何判断锁的?

  版本9.2.0.5

  原提交于美国东部时间2005年12月12日11:19,最后更新于2005年12月12日16:22

  问:

  Tom,

  在你的书和帖子里,你写到Oracle和其他数据库最大的区别之一就是锁机制。如果Oracle不维护一个锁的列表(如同大多数其他数据库一样), Oracle是如何知道什么当前被锁定了呢。V$LOCK是从哪里得到信息的?Oracle是查看每一个数据块来查到当时在数据库中的锁么?

  谢谢

  答:

  v$lock显示某事务在指定表的零行(即没有行锁——译注)、一行或更多行上有锁。

  如果我锁了那个表上的1,000行或1行或10,000,000,v$lock并不为每一行显示一条记录,它里面只有一行,说明我持有“某些东西”,但没有说是什么……

  要找到我锁定的那些行,那得去那些行——锁是数据本身的属性。

  (在我的书和其他贴子里我已经进行了详细的讲解……一下引自Expert One on One Oracle和Expert Oracle: Database Architecture)

  <quote>

  TX (Transaction) Locks

  TX(事务)锁

  当一个事务实例化它的第一个修改,就获得了一个TX锁,并保持到执行COMMIT或ROLLBACK。这是一个排队机制,其他会话将等待该事务完成。你在事务中修改的每一行或SELECT FOR UPDATE都将“指向”该事务相关的一个TX锁。要理解为什么,你需要概念上理解锁“存在”在哪里,是如何管理它们的。Oracle中锁是作为数据的属性保存的(阅读第10章Oracle]块格式概述)。Oracle中没有一个传统的锁管理器来维护系统中锁住的每一行信息的长列表。许多其他数据库这样做,是因为对它们而言锁是一个稀有资源,需要监控其使用。用的锁越多,系统需要管理的也越多。所以在这些系统里是否用了“过多”的锁是一个需要考虑的问题。

  在一个使用传统基于内存的锁管理器的数据库中,锁定行的流程类似如下:

      1. 查找你需要锁定行地址

      2. 获取对锁管理器的访问(因为它是一个普通内存结构,这是需要串行化的)

      3. 锁定列表

      4. 搜索列表查看是否已有其他人锁定该行

      5. 在列表中创建新记录以确定你已经锁定该行

      6. 解锁列表

  现在你锁住了这行,可以修改了。之后,当你提交你的修改,需要继续如下的流程:

      7. 再次访问锁管理器

      8. 锁住锁的列表

      9. 搜索列表,释放你所有的锁

      10.解锁列表

  正如你看到的,获得的锁越多,修改数据之前和之后的操作所需时间越多。Oracle不这样做。Oracle的流程类似如下:

      1. 查找你需要锁定行地址

      2. 访问行

      3. 锁定行(如果已经被锁,则等待锁定它的事务结束,除非你使用了NOWAIT选项)

  完成了。由于锁作为数据属性存放,Oracle不需要一个传统的锁管理器。事务只是简单的访问数据并锁定它(如果它还没被锁定)。有趣的是,当你访问时,数据即便没有被锁,可能看起来也像被锁了。当你在Oracle中锁住了多行数据,该行指向一个与含有该数据的块一起存放的事务ID,当锁被释放,事务ID还被保留着。这个事务ID对你的事务是w唯一的,代表了回滚段号(rollback segment number)、槽(slot)和序号(sequence number)。你将(事务ID——译注)留在含有那些行的块中来告知其他回话,你“拥有”这些数据(不是块中所有数据,只是你修改了的行)。当出现另一个会话,它可以迅速查看拥有锁的会话是否仍然活动。如果锁不再活动(active),这个会话获准访问数据。如果锁仍然活动,在锁被释放后将立即告知这个会话。这样你得到了一个排队机制:申请锁的会话将排队等待(持有锁的——译注)那个会话完成,然后获得数据。

  </quote>

  --------------------------------------------------------------------------------

  评论:           

  Followup to How does Oracle determine locks  December 12, 2005

  评论者:Venkat

  Thanks for the answer, Tom.  I do understand that locks are stored along with

  the rows.  What I still don''t get is HOW does Oracle know what locks there are,

  if a list is not maintained.  Are you saying that Oracle maintains "something"

  that tells it there are 1 or more locks which it can find by going to the rows?

  So there may be 10,000 rows locked but it is indicated by a single entry

  somewhere?

  谢谢你的回答,Tom。我知道锁是和行存放在一起的。我仍然不明白的是,如果不维护一张列表,Oracle怎么知道有哪些锁。你是说Oracle维护“某些东西”,(这些东西——译注)可以通过访问这些行来告诉你有一个或更多的锁?所以可能锁了10,000行,但只用一个记录来表示。

  回复:

  Oracle不需要知道有什么锁。为什么要(知道——译注)呢?

  它所知道的是,“事务A修改了表T,所以在事务A提交/回滚前,在V$LOCK中有一个TX锁说明这个事实”。

  它不知道那些行被锁了,它不关心。

  --------------------------------------------------------------------------------

  --------------------------------------------------------------------------------

  原文标题:

  Venkat -- Thanks for the question regarding "How does Oracle determine locks", version 9.2.0.5

  原文地址:

  http://asktom.oracle.com/pls/ask ... :F4950_P8_DISPLAYID,F4950_P8_CRITERIA:53140949357315

  --------------------------------------------------------------------------------

  原文版权归属asktom.oracle.com所有,翻译 by ern·CNOUG

  2005-12-15 11:24:00

  
0
相关文章