2009-07-10 30 views
1

所以,我有一個設計問題:我有幾個進程正在更新我的數據庫。舉個例子,設想一個銀行系統,我正在記錄從一個賬戶到另一個賬戶的轉賬。在這種情況下,我必須從源帳戶中扣除轉帳金額,並將相同金額作爲單筆交易記入目標帳戶。JPA從多進程寫入單個數據庫

我想確保沒有任何條件可以破壞我的交易,所以我最初考慮的是對源帳戶和目標帳戶進行悲觀鎖定,同時執行計算並提交更改。從我在網上閱讀的有關JPA的文章中,似乎不容易支持悲觀鎖定(至少不是直接)。

任何人都可以給我一個其他方式的想法,我可能能夠確保我的交易在多個流程中的完整性?

任何幫助/指針非常感謝。

謝謝...

--Steve

回答

2

用於在使用分離的持久性(例如JPA)是因爲它趨向於降低在爭用的量,以使用樂觀鎖定系統鎖定的優選方法數據庫級別,允許讀取在發生寫入時繼續。啓用樂觀鎖定的方法是將@Version註釋添加到類中的特定版本字段。

@Entity 
public class Account { 

    @Id 
    private long id; 

    @Version 
    private long version; 

    @Basic 
    private BigDecimal balance; 
} 

然後,JPA實現將爲您管理您的對象版本。建議您將此字段保留爲私有,並且不要爲其指定getter或setters,因爲您希望JPA實現對此字段負責。您的主要考慮因素將是拋出OptimisticLockException時應採取的行動(如果其他人在您設法保存更改之前更新了其中一個帳戶,會發生什麼情況)

不幸的是,沒有解決方案可解決此問題,最簡單的方法是重新加載這兩個帳戶並重試交易,如果您沒有太多的交易同時訪問同一個帳戶,那麼這將很好地工作。在這種情況下,您可能會遇到一些問題,的時間重試交易,但最好從簡單的解決方案開始,然後根據應用需求更改實施方案。

+0

是的,我曾看過樂觀鎖定,但我的印象是客戶端代碼必須ch eck版本。如果您說在JPA提供程序本身進行合併/更新操作時會進行此檢查(從而避免客戶端必須檢查的競爭條件),那麼這實際上是一種更好的方法。 顯然,我有樂觀鎖定的方法的不同的誤解...... 感謝 --Steve – Steve 2009-07-10 19:31:06