Oracle SQL - SELECT查询锁索引&阻止DML会话

时间:2016-12-09 17:54:17

标签: sql oracle plsql concurrency oracle11g

我们在生产中发生了一些非常奇怪的锁定。我们已经设置了一个PL / SQL脚本,可以找到已被锁定超过5秒的对象并向我们发送警报电子邮件。

以下是该脚本的光标:

SID  TRANS-ID        L-TYPE  CTIME  BLOCK OSUSER     MACHINE         MODULE        SQLID            ROWID            OBJECT
---- --------------- ------- ------ ----- ---------- --------------- ------------ ------------- ------------------ --------------------
669  132,11,40475    6/0     70     1     userpr1     serv1023       userpr1-00002 fbnhs4gd9a7yn .                  IDX_005
1133 132,11,40475    0/6     62     0     userpr1     serv1023       userpr1-00000 f0gm2rx85qjja AAAgOuAAFAAD04TAAW ITEMST
924  132,11,40475    0/6     53     0     userpr1     serv1023       userpr1-00002 f0gm2rx85qjja AAAgOuAAFAAD04TAAW ITEMST
927  132,11,40475    0/6     27     0     userpr1     serv1023       userpr1-00001 f0gm2rx85qjja AAAgOuAAFAAD04TAAW ITEMST

今天我们收到了锁定警报:

fbnhs4gd9a7yn

从上面可以看出,我们可以观察到会话669的sqlid IDX_005已锁定索引fbnhs4gd9a7yn并阻止其余剩余会话。

现在最奇怪的部分:

  1. SQLID IDX_005只是一个SELECT查询(甚至不是SELECT FOR UPDATE)
  2. 索引ITEMST与表ITEMST没有任何关联,但它阻止剩余的3个会话,无论如何都会更新ITEMST
  3. 所以我的问题是: [1]是如何发生的?为什么它阻止更新到表_PyCObject_Type

    这可能是Oracle中的错误吗? 我们正在使用Oracle 11.2.0.4企业版,顺便说一句。

1 个答案:

答案 0 :(得分:5)

您的查询返回的sql_id可能与实际获得锁定的查询有关,也可能与之无关。

例如,在SID 669中,如果我更新ITEMST然后运行查询但我还未提交update,您就会看到669正在运行{ {1}}语句并且它持有一个锁。这是会话实际获得锁定的早期SELECT(或UPDATE或其他)。现在还没有一种简单的方法可以查看会话已经完成的先前查询获得了其他会话正在等待的锁定。