编辑数据库包或者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%');
注意:这次的原因是因为,一个发送报文的程序,写在了一个对象中,一旦这个调用这个对象的发送报文程序,则其依赖的对象都会被锁定,直到事物结束。
程序设计的时候,一些核心的和被频繁调用的程序要单独成包,降低耦合,避免过度的依赖造成无意义的锁。