2014-05-02 49 views
0

我一直認爲READ_COMMITTED(DB2稱之爲遊標穩定性(CS))意味着您不會鎖定讀取,並且您只讀取提交的數據。剛剛發生的一種情況讓我意識到,DB2在CS中讀取時鎖定了,儘管非常簡短。DB2遊標穩定性 - 死鎖

因爲它很簡短,所以很容易發生死鎖。我們有一個更新X行的客戶端代碼,然後調用一個Web服務,在許多其他事情中,它們需要讀取X行。由於客戶端代碼需要能夠在Web服務失敗時回滾,因此它必須在執行期間保持該鎖定Web服務調用。

隨着服務運行在READ_COMMITTED,我認爲它不會等待記錄,但會只讀舊數據並繼續(這很好)。

有沒有辦法,在READ_UNCOMMITTED(這給了我的意志)運行短缺,使我的服務不進入鎖 - 等待一個讀事件?我主要是在運行java hibernate,但是如果你知道純粹來自DB2方面的技巧,即使這些技巧會提供信息。

+0

請參閱http://stackoverflow.com/questions/19629299/ms-sql-server-2008-with-nolock-equivalent-for-ibm-db2-9-7 – dav1dsm1th

+3

哪種類型的操作系統是您的DB2服務器上運行的,以及哪個版本的DB2? – WarrenT

+0

什麼是webservice在做什麼 - 你可以簡單地更新數據庫_afterwards_?我相信DB2在會話期間足夠聰明以共享鎖定。如果你有兩個不同的系統/會話訪問同一行......爲什麼? –

回答

2

默認行爲在CURSOR STABILITY(DB2方式)中,讀者被阻止。但是,通過新的類似於Oracle的功能,可以更改此行爲。

根據您的DB2版本,如果您已遷移,可能只需更改爲CUR_COMMIT級別。

請看看at this article,這非常清楚地解釋了這種行爲。

更多信息請見the product documentation