2015-10-27 46 views
1

我有兩個進程訪問同一個表。它們中的每一個都運行select for update查詢並設置WAIT值。WIll選擇更新等待會永久鎖定行嗎?

我的問題是:如果進程1運行查詢並在表中鎖定n行,如果在提交之前進程崩潰,行如何釋放?

我試圖打開sql開發者中的兩個會話,並在第一個會話中運行select for update,然後關閉它。在第二個會話中查找相同的查詢,並發現這些行仍然被鎖定!

回答

0

只要事務持續*,事務持有的鎖定。釋放它們的唯一方法是結束交易。

「墜毀」是什麼意思?在三層應用程序中,當前端出現故障時,中間層通常會通過關閉關閉任何關聯事務的邏輯會話進行清理。在客戶端 - 服務器應用程序中,如果鎖的持有者沒有正常關閉,Oracle可能不會立即察覺。 DBA通常會配置死連接檢測,以便定期向客戶端發送ping命令以驗證它們是否仍處於活動狀態,以便數據庫可以在幾分鐘後識別出存在會話並將其回滾。如果數據庫未配置爲檢測到問題並且客戶端/服務器應用程序未關閉事務,則可能需要等待一段時間。可能會有一個配置文件限制會話可以連接的時間或一段時間後會殺死會話的DBA腳本,或者您可能需要調用DBA並要求他們終止其他會話。

*爲了迂迴,您可以通過dbms_lock獲取用戶定義的鎖,這些鎖可以持續存在會話而不是交易。但這超出了這個問題的範圍。

+0

嗨,謝謝你的回答。例如,如果其中一個應用程序服務器(其中調用了sql)崩潰了。在這種情況下,我仍然需要死連接檢測嗎? – xcoder

+0

@xcoder - 我很難想出很多我不希望死連接檢測的情況。據推測,應用程序服務器失敗的情況非常罕見,因此DBA可以進入並查找在失敗之前從該應用程序服務器創建的任何會話並殺死它們。但是這要求您將DBA引入特定於應用程序服務器的故障,這通常不是您想要做的事情。我強烈的偏見會自動化自動化。 –