2014-10-27 61 views
1

我有幾個在同一行上執行的調度進程。其實這一行是需要發送的短信。第一個過程是@Asynchronious過程,當我按下發送按鈕時調用,第二個過程是@調度過程,每分鐘調用一次。在我寫了一個SMS到數據庫之後,它的狀態爲0.在我成功或失敗地發送它之後,它將相應地具有狀態2或3。問題是,當我從DB2讀取SMS時,但在實際發送之前,第二個進程可以讀取併發送它。所以,我的問題如何防止呢?我可以鎖定特定的行來閱讀嗎?另一種方法是在讀取特定行時添加額外狀態「處理」並更改此狀態,但我懷疑是否可以同時讀取和寫入?我雖然也關於全球旗幟,這將表明這個過程不能運行,但我不僅尋找解決方案,我還尋找最正確的解決方案。非常感謝你!我可以鎖定一排DB2以供閱讀嗎?

很遺憾,我的英語傢伙,如果有人將編輯它,我會很感激。

回答

1

不能可靠地防止其他應用程序讀取一個應用程序鎖定的行。運行未定義的查詢讀取隔離級別的查詢將能夠訪問甚至專門鎖定的行。使用當前提交的語義,使用遊標穩定性隔離級別運行的查詢將訪問先前版本的專用鎖定行。

我覺得你最好的選擇是在狀態欄使用一個特殊的值(如「處理」),以防止其他會話處理同一行。

0

好吧,其實我是通過創建具有以下其中運行它的值改爲true標誌public static boolean busy;第一種方法解決了單,並同時它的真實第二種方法不運行。第一種方法完成後,它將其更改爲false。

+2

請注意,只有您有一臺服務器才能使用該功能。找到一個數據庫解決方案可能是最好的。請注意,通過正確的隔離級別,如果您執行了對該行的讀取,那麼將在事務處理期間將其鎖定以供讀取,並且可以稍後進行更新。或者,您可以選擇更新以使用寫入意圖進行讀取。 – 2014-10-27 15:42:29

+0

感謝您的警告我會盡力實施這個解決方案。 – Anatoly 2014-10-28 05:36:12

1

我假設你正在使用DB2用於Linux/UNIX/Windows的,因爲你沒有提到的平臺。

有一種方法可讓DB2在SELECT上鎖定一行,請參閱this Information Center page上的isolation-clauselock-request-clause

當指定或者RR(可重複讀)的隔離級別或RS(讀穩定性),你也可以說,要鎖定正在讀取行,無論是與一個SHAREUPDATE,或EXCLUSIVE鎖。

該聲明將只要交易活躍鎖定該行。

相關問題