编辑oracle对象的时候被锁的检查 ora-04021

编辑数据库包或者object的时候被锁了,但是检查锁的时候没有查到原因

纠结了一下,后来想到是否是因为依赖对象的锁导致的连环锁,做追踪检查,最终确认了问题

第一步,检查对象被锁的代码,未找到相关锁

SELECT a.Sid
      ,a.Serial#
      ,b.Sql_Fulltext
      ,a.Machine
      ,a.Status
      ,a.Blocking_Session
      ,a.Blocking_Session_Status
  FROM V$session a
      ,V$sql     b
 WHERE a.Sql_Id = b.Sql_Id
   AND b.Sql_Fulltext LIKE '%XXINTERFACE_PAGE%';

第二步,检查该对象的依赖关系

说明:Dba_Dependencies表的referenced_name表名被依赖对象,及如果对象“XXINTERFACE_PAGE”被修改,会影响那些对象,如果这些对象在锁,则XXINTERFACE_PAGE不能被修改
SELECT *
  FROM Dba_Dependencies Dd
 WHERE Dd.referenced_name = 'XXINTERFACE_PAGE';

第三步,参照第一步的代码,检查依赖对象的锁,果然,有被锁的对象,解开锁就可以正常编译了
SELECT a.Sid
      ,a.Serial#
      ,b.Sql_Fulltext
      ,a.Machine
      ,a.Status
      ,a.Blocking_Session
      ,a.Blocking_Session_Status
  FROM V$session a
      ,V$sql     b
 WHERE a.Sql_Id = b.Sql_Id
   AND (b.Sql_Fulltext LIKE '%XXINTERFACE_SYSTEM_BOM%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_SYSTEM_GTS%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_SYSTEM_BOM%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_SYSTEM_GTS%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_MESSAGE%'
or b.Sql_Fulltext LIKE '%XXCUS_ITEMSYNC_NEW_PKG%'
or b.Sql_Fulltext LIKE '%XXCUS_GTS_ITEMS_PKG%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_SYSTEM%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_MESSAGE_GTS%'
or b.Sql_Fulltext LIKE '%XXCUS_INT_MESSAGE_NEW_UTL%'
or b.Sql_Fulltext LIKE '%XXCUS_INT_MESSAGE_NEW_UTL%'
or b.Sql_Fulltext LIKE '%XXCUS_INT_MESSAGE_INFO_UTL%'
or b.Sql_Fulltext LIKE '%XXCUS_BOM_EXPAND_PKG%'
or b.Sql_Fulltext LIKE '%XXCUS_INT_MESSAGE_INFO_UTL%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_SYSTEM%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_MESSAGE%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_PAGE%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_PAGES%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_MESSAGE_GTS%'
or b.Sql_Fulltext LIKE '%XXINTERFACE_PAGE%');

注意:这次的原因是因为,一个发送报文的程序,写在了一个对象中,一旦这个调用这个对象的发送报文程序,则其依赖的对象都会被锁定,直到事物结束。

程序设计的时候,一些核心的和被频繁调用的程序要单独成包,降低耦合,避免过度的依赖造成无意义的锁。

上一篇:java处理高并发高负载类网站的优化方法


下一篇:Leecode刷题之旅-C语言/python-349两整数之和