我们在生产中发生了一些非常奇怪的锁定。我们已经设置了一个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
并阻止其余剩余会话。
现在最奇怪的部分:
IDX_005
只是一个SELECT查询(甚至不是SELECT FOR
UPDATE)ITEMST
与表ITEMST
没有任何关联,但它阻止剩余的3个会话,无论如何都会更新ITEMST
所以我的问题是:
[1]是如何发生的?为什么它阻止更新到表_PyCObject_Type
?
这可能是Oracle中的错误吗? 我们正在使用Oracle 11.2.0.4企业版,顺便说一句。
答案 0 :(得分:5)
您的查询返回的sql_id
可能与实际获得锁定的查询有关,也可能与之无关。
例如,在SID 669中,如果我更新ITEMST
然后运行查询但我还未提交update
,您就会看到669正在运行{ {1}}语句并且它持有一个锁。这是会话实际获得锁定的早期SELECT
(或UPDATE
或其他)。现在还没有一种简单的方法可以查看会话已经完成的先前查询获得了其他会话正在等待的锁定。