2011-10-24 113 views
2

我在這裏補充一些sql。我要的是像下面這樣:Oracle中的自願事務優先級

select ... for update priority 2; // Session 2 

所以,當我在另一個會話

select ... for update priority 1; // Session 1 

它立即返回運行,並在會話2將引發錯誤(並因此執行回退),並鎖定在會話中的第1行

然後,同時會話1持有鎖,運行在會話2.

select ... for update priority 2; // Session 2 
以下

將等到會話1釋放鎖定。

我怎麼能實現這樣的計劃,因爲priority x只是我已經編造的東西。我只需要可以做兩個優先級別的事情。另外,我很高興隱藏了我在PL/SQL過程中的所有邏輯,我不需要爲泛型SQL語句工作。

我正在使用Oracle 10g,如果這有什麼區別。

回答

1

我不知道如何建立一箇中斷Oracle中的原子進程的方法。我認爲你唯一能做的事情就是通過編程將你的更大的進程分解成更小的進程並輪詢某種類型的定點表。因此,不要爲一百萬行進行單個更新,也許可以編寫一個更新1k的proc,檢查作業表(或類似的東西),看看是否有更高優先級的進程在運行,並且如果有更高優先級的進程在運行,通過等待循環暫停自己的執行。我認爲這是唯一能讓你的會話在這個過程中保持活躍的狀態。

如果你真的想中止當前運行的進程,優先級較低的線程並丟失會話是可以接受的,那麼我會再次建議一個作業表,它註冊了正在運行的SQL和它的會話ID運行。如果您運行更高優先級的語句,它應該再次檢查作業表,然後向低優先級會話(http://www.oracle-base.com/articles/misc/KillingOracleSessions.php)發出kill命令,並插入記錄到工作表中,注意它被殺的事實。當優先級較高的進程完成時,它可以檢查作業表以查看它是否有責任殺死任何東西,如果是,則重新發布它。

-1

這就是資源管理器的實現。

+1

hrm,你確定這個......資源管理器會給你分配它的優先級(cpu/io),但是就我所知,鎖仍然可以工作,只是因爲一個會話有更多的資源分配給它並不意味着它的鎖可能會被盜。 –

+0

這是不正確的。數據庫資源管理器避免了優先級反轉問題。 – steve

+0

你能否提供一個使用資源管理器來解決這個問題的例子? –