SQL> create or replace PROCEDURE pining此時Calling對于Pining的引用將會在Pining的Body上獲得共享Pin,此時在另外一個Session執行重建Procedure的操作:
2 IS
3 BEGIN
4 NULL;
5 END;
6 / Procedure created.SQL>
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.SQL> create or replace procedure calling
2 is
3 begin
4 pining;
5 dbms_lock.sleep(60);
6 end;
7 /Procedure created.SQL>
SQL> col object_name for a30
SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:12:57
PINING 2007-04-02 09:12:57SQL>
SQL> exec calling;
SQL> create or replace PROCEDURE pining這個操作將一直掛起,直到第一個session的操作完成,此時在第三個session可以觀察到Library Cache Pin的競爭:
2 IS
3 BEGIN
4 NULL;
5 END;
6 /
SQL> select sid,event from v$session where username='EYGLE'當第一個session執行完成之后,第二個session的操作隨之完成,我們可以看到LAST_DDL_TIME并未改變:
2 / SID EVENT
---------- ----------------------------------------------------------------
137 library cache pin
139 PL/SQL lock timer
157 SQL*Net message to client
SQL> exec calling; PL/SQL procedure sUCcessfully completed.SQL>實際上session 2執行了一次無謂的Library Cache Pin,理想的方式應該是,Oracle能夠判定之前的Library Cache Pin的模式,假如是共享模式,則可以跳過Pin請求,假如是排他模式,則必須等待,目前的處理并不能從實質上改變競爭。不過并非全無益處,我們發現,對于另一類DDL操作,Oracle完全可以跳過Library Cache Pin的請求,這類操作是Grant,在以前版本中的行為可以參考:
SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:12:57
PINING 2007-04-02 09:12:57
09:40:18 SQL> drop procedure calling; Procedure dropped.在Session 2執行授權:
09:40:18 SQL>
09:40:18 SQL> drop procedure pining;Procedure dropped.09:40:18 SQL>
09:40:18 SQL> create or replace PROCEDURE pining
09:40:18 2 IS
09:40:18 3 BEGIN
09:40:18 4 NULL;
09:40:18 5 END;
09:40:18 6 /Procedure created.09:40:18 SQL>
09:40:18 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.09:40:18 SQL> create or replace procedure calling
09:40:18 2 is
09:40:18 3 begin
09:40:18 4 pining;
09:40:18 5 dbms_lock.sleep(60);
09:40:18 6 end;
09:40:18 7 /Procedure created.09:40:18 SQL>
09:40:18 SQL> col object_name for a30
09:40:18 SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:40:18
PINING 2007-04-02 09:40:1809:40:18 SQL>
09:40:18 SQL> exec calling;
SQL> set time on我們看到Session 2的授權順利通過,再轉到Session 1:
09:40:22 SQL> grant execute on pining to sys; Grant succeeded.09:40:22 SQL>
09:40:18 SQL> exec calling; PL/SQL procedure successfully completed.09:41:18 SQL>我們看到對象PINING的LAST_DDL_TIME已經變化。
09:41:18 SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:40:18
PINING 2007-04-02 09:40:22
新聞熱點
疑難解答