2016-03-15 72 views
0

我有清除(通過delete from語句)和幾個填充一個PL/SQL腳本依賴表是這樣的:禁用查詢表上同時更新

delete from table-A 
insert into table-A values(...) 
delete from table-B 
insert into table-B values(...) 

這些操作需要約10秒才能完成,我會就像在表更新時停止嘗試從表A或表B讀取數據的所有sql查詢一樣。當表A和表B完全更新時,這些查詢應停止並繼續執行。

這樣做的正確方法是什麼?

+5

你爲什麼要那樣做?至於刪除/插入在事務中(它們之間沒有提交),用戶不會看到「之間」狀態。如果這是你想要防止的,Oracle中沒有髒讀。 –

+0

阻止任何**閱讀**表的唯一方法是撤銷對其的SELECT權限。正如@弗洛林吉塔所說,沒有必要這樣做。 –

回答

0

正如其他人所指出的,Oracle的基本併發模型是作者不會阻止讀者,讀者也不會阻止作者。您無法停止運行簡單的select。您的查詢將會看到他們開始執行的SCN數據(假設您使用默認的read committed事務隔離級別),以便在您的更新開始之前它們將具有一致的數據視圖。

您可能使用dbms_lock.request獲取自定義命名鎖。在運行更新之前,您需要獲取此鎖,並且每個查詢表的會話在開始查詢表之前也需要獲取該鎖。顯然,這會降低應用程序的可伸縮性,但它會完成您似乎要求的內容。據推測,執行查詢的會話可以獲取共享模式下的鎖定,而執行更新的會話需要以獨佔模式獲取。