2010-09-15 20 views
0

我只是想看看數據是否被越來越插在桌子上或不..甲骨文睡眠或鎖定檢查處理

,所以我必須這樣寫的:

select count(*) from emp; 
dbms_lock.sleep(1); 
select count(*) from emp; 

因此,它會睡1分鐘。即使在睡眠後,如果第一次計數和第二次計數不同,那麼數據也會插入到表格中。

否則插入不會發生。

但是我對此有個疑問,無論這個實例會掛1秒還是整個數據庫都會掛1秒。

如果它錯了如何實現這一點。

+8

「即使在睡眠後,如果第1次計數和第2次計數不同,那麼數據也會插入到表中。」請記住,如果其他進程正在執行批量插入,那麼除非SLEEP()超過事務邊界(即otehr進程在間隔中發出提交),否則兩個計數將保持不變。 – APC 2010-09-15 17:16:26

回答

3

只有你的PL/SQL塊會進入睡眠狀態。如果你想睡一分鐘,通過60(秒)睡覺。

0

更清楚的是,你不知道插入是否沒有發生;你所知道的是,承諾記錄的數量沒有變化。如果您有權訪問V$TRANSACTION,則可以查看USED_UBLKUSED_UREC以驗證正在進行的交易正在生成更改。

0

你如何插入表格?它是批次嗎? OLTP?我不認爲你的建議是實際的,但是在提供更多信息之前不能建議其他方式。向我們提供更多有關此過程的信息。

1

如果您不想將EXECUTE授予DBMS_LOCK,則可以使用USER_LOCK.SLEEP,這可能會造成更大的破壞性。參數是不同的,但你可以達到同樣的目的。

USER_LOCK.SLEEP PROCEDURE SLEEP 參數名稱類型輸入/輸出默認值?


TENS_OF_MILLISECS數量

DBMS_LOCK.SLEEP 程序SLEEP 參數名稱類型輸入/輸出默認?


秒數IN

0

首先對不起我的英語:-D AFAIK SELECT COUNT(*)是在浪費資源。我建議你創建一個觸發器來增加其他地方插入的行數。您的計劃作業然後檢查插入的行數並在退出之前將其重置爲零。通過這種方式,您可以知道是否有任何行在插入之間插入了多少行。

create table emp_stat(inserted int); 

insert into emp_stat values(0); 
commit; 

create trigger emp_trigger  
before insert on emp for each row  
begin  
    if ( inserting ) then  
     update emp_stat set inserted = inserted + 1;  
    end if;  
end;