2017-11-18 175 views
0

解釋,請點擊這裏本段從文檔DBMS_ALERT輪詢間隔

WAITANY程序。如果您使用WAITANY過程,並且如果信令會話執行信號但在信號的一秒鐘內未提交,則需要輪詢循環,以便此未提交的警報不會僞裝其他警報。輪詢循環從一秒鐘間隔開始,並以指數方式退避至30秒間隔。

我正確理解,在這裏有人說,當在服務器上調用WAITANY時,線程以特定間隔查詢事件的存在嗎?如果我用超時的足夠長的時間呼叫WAITANY,當事件發生時,只有當前請求間隔到期後纔會通知我?那些。在服務器上就像這樣的代碼

function WaitAny(ATimeout) { 
    const intervals = [0, 1, ....., 30); 
    for (i = 0; i < intervals.length; i++) { 
    Sleep(min(intervals[i], ATimeout)) 
    if (IsExistsEvents()) 
     return 0; 
    ATimeout -= intervals[i]; 
    if (ATimeout <= 0) 
     return 1; 
    } 
    maxInterval = intervals[intervals.length - 1]; 
    while (ATimeout > 0) { 
    Sleep(min(maxInterval, ATimeout)) 
    if (IsExistsEvents()) 
     return 0; 
    ATimeout -= maxInterval; 
    } 
    return 1; 
} 

回答

1

不,它仍然是「立即」。

當有人發出警報時,會彈出服務員將看到的管道消息(非事務性消息)。但當然,服務員在信號員提交之前還沒有「正式」收到警報。

因此,服務員得到blip,然後等待鎖(警報通過Oracle的標準鎖定機制實現)。因爲我們期待提交很快就會到來。

如果沒有,這是一個問題,因爲如果我們從不同警報(因爲我們在這裏做WAITANY)得到一個信號。所以當這個提交沒有到來時,我們會默認並執行指數回退。但它不是「在1,2,4等秒鐘內檢查警報」,它「每1,2,4,...秒重新進入等待鎖定狀態」。所以當這個承諾到來時,我們幾乎可以直接看到它。

例如,我跟蹤2分鐘的等待時間上的警報從別人誰信號,但並沒有犯

declare 
    n varchar2(100); 
    m varchar2(100); 
    s int; 
begin 
    dbms_alert.WAITANY(n,m,s); 
end; 

call  count  cpu elapsed  disk  query current  rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse  1  0.00  0.00   0   0   0   0 
Execute  1  0.00  127.49   0   0   0   1 
Fetch  0  0.00  0.00   0   0   0   0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total  2  0.00  127.50   0   0   0   1 

Misses in library cache during parse: 1 
Optimizer mode: ALL_ROWS 
Parsing user id: 107 

Elapsed times include waiting on following events: 
    Event waited on        Times Max. Wait Total Waited 
    ---------------------------------------- Waited ---------- ------------ 
    enq: UL - contention       9  32.01  127.47 
    log file sync         1  0.00   0.00 
    SQL*Net message to client      1  0.00   0.00 
    SQL*Net message from client      1  0.00   0.00 
******************************************************************************** 

你可以看到2分鐘的等待是幾乎所有的鎖等待。