2011-07-07 121 views
1

我正在使用Eclipse鏈接實現,但也許這與Hibernate相關。 在某些時候,我叫:JPA鎖定是否被視爲原子?

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

這一點我認爲是一個原子操作。

令人驚訝的是 - 在@Version字段上放置了一個斷點後,似乎有很多電話撥打entity._persistence_getentity._persistence_set

顯然 - 使用兩個瀏覽器可以與調試器達到相同點,並在線程仍在運行這些隱藏函數時切換線程。完成後 - 兩個線程都不可能稍後刷新/提交。

當不在發佈模式時,會發生這種變化嗎?還是僅僅因爲調試器?

問候, 丹尼爾

+0

我不確定我是否理解你的問題。你是什​​麼意思的原子?一個連接的實體不應該在幾個線程中使用。 –

+0

Atomic =操作期間不允許上下文切換。 – Daniel

回答

0

沒有辦法(據我所知),以防止上下文切換的Java。因此,我不明白在這個意義上鎖定是如何成爲原子的。但是我也不明白爲什麼它很重要,因爲附屬實體不應該被多個線程同時使用。

+0

有沒有辦法防止這種情況發生?如果兩個用戶試圖同時更新相同的字段 - 如何防止它發生?我認爲鎖定是唯一的解決方案。 – Daniel

+0

鎖定用於防止在數據庫**中同時修改一行**。它幾乎與線程無關:兩個事務可能在兩個不同的JVM上運行。由鎖造成的版本字段的增量會使兩個併發事務中的一個事務回滾,但有一個例外。但是線程上下文切換對機制沒有任何影響。請閱讀http://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and以獲取解釋。 –