在Oracle RDBMS中,等待获取排他行锁的几个会话中的哪一个在释放时将首先得到通知?

dgenwo3n  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(73)

假设如下:
1.有一个用户会话持有表中几行的排他锁。

  • 另外两个(或更多)会话被启动,每个会话都请求获取当前持有的一些锁
  • 为了简化这种情况,我们假设新会话只想获取一个行锁,而且它们都需要同一个行锁。实际上,不太可能完全按照这种方式发生,因为每个会话都将尝试锁定一个由相连行组成的“孤岛”,但我怀疑这会影响这个问题的答案。
  • Documentation on concurrency说道:

如果锁处于活动状态,则会话会要求在锁被释放时得到通知。`

  • 持有锁的原始会话提交并释放其锁。

两个等待会话中的哪一个将得到通知,它现在能够获取锁?是否有DB设置来控制此操作?
如果以随机顺序通知等待者,这是否意味着当许多等待者竞争同一个锁时,有可能使其中一个会话缺锁,或者是否有一种机制来解决这种情况?

wgxvkvu9

wgxvkvu91#

当你在寻找一个资源(并且其他人拥有它)时,你会进入一个“等待者”队列,顾名思义,你会“排队”。
如果你真的想深入挖掘,让一个会话锁定一行,然后让其他几个会话等待该行,然后这样做:

alter session set events = 'immediate trace name enqueues level 3';

以获取显示浮动的各种队列的跟踪文件。
一个很好的资源是:Oracle Core,Jonathan刘易斯著。

相关问题