2010-12-20 13 views
5

比方說,我有充當車庫一堆汽車的桌面應用程序:多個線程訪問數據庫:一個長事務,一個短交易

@Entity 
public class Garage { 
    private List<Car> cars = new ArrayList<Car>(); 
    ... 
} 

的桌面應用程序有一個「模擬「按鈕,啓動一個新的線程並開始調用車庫,汽車,車輪等方法。這種模擬可能需要長達10分鐘才能運行。目前,我有一個類,看起來像這樣:

beginTransaction(); 
Garage garage = garageDao.findGarage(1); 
List<Car> cars = garage.getCars(); 
for (Car car : cars) { 
    // call methods on the car to lazily fetch other things like wheels... 
} 
commitTransaction(); 

此代碼僅做「讀」,也不會「寫」

所以上面可以根據汽車如何迫切需要花費很長的時間一項服務。在發生上述情況時,用戶可能會繼續使用桌面應用程序工作。他們可能會選擇更改上述交易中使用的汽車的顏色。

我的問題是,上述長交易是否會阻止汽車顏色的改變?即用戶改變桌面應用程序中汽車的顏色將被阻止提交更改,直到長交易完成爲止?

+0

爲什麼你需要一個交易來閱讀?你在使用懶惰抓取? – saugata 2010-12-20 07:18:24

+0

'更新線程'必須是單個事務單元嗎?還是沒有更新?你說:「這段代碼只是'讀'而不寫',然後 - 就像saugata問 - 爲什麼你需要交易? – 2010-12-20 07:36:04

+0

是的,在汽車上調用的方法可能類似於getWheels(),它們正在延遲獲取 – digiarnie 2010-12-20 08:12:32

回答

4

爲什麼要這樣呢?默認情況下,您使用樂觀事務,因此沒有鎖定可應用於正在讀取的行(除非您未向我們展示一些JPA2鎖定()調用)。然後,事務的提交應該檢查記錄的樂觀版本(如果您有版本定義)並使用它來決定是否提交更改。

+0

nope,無鎖()調用 – digiarnie 2010-12-20 08:13:14

0

答案很可能取決於您使用的數據庫,更重要的是哪個事務隔離級別。

但是答案總的來說不是:他們不應該阻止(但正如我所說的,依賴於數據庫和事務級別)。

0

如上:

通常情況下,只讀操作不應該在一個數據庫塊寫操作。 所以你的長讀線程不應該阻塞短寫操作。

我想可以爲您的數據庫和連接配置一個隔離級別,寫入操作可以被長讀取語句阻塞,但這不是我所知道的任何數據庫類型的默認值。

相關問題