2011-11-06 79 views
1

我正在使用JPA 2.0,Hibernate和MySQL。 MySQL數據庫的隔離是TRANSACTION_REPEATABLE_READ。我有一組查詢將用於在網站上顯示數據。其中一些查詢將不得不獲取很多行,並且可以通過其他進程修改它們。我是否必須對這些只讀查詢使用任何類型的鎖定(悲觀或樂觀),以確保結果集一致?只讀事務表鎖定

通過@Version註釋對自動對象版本化使用樂觀鎖定是否對只讀查詢有意義?

我不知道爲什麼任何人都不得不明確指定LockModeType.OPTIMISTIC實體或查詢。如果對象是版本化的,它將在提交時被檢查,對吧?

回答

1

如果您將選擇放入事務中,則TRANSACTION_REPEATABLE_READ隔離級別將阻止選定的行更新,直到您選擇的事務提交。但不會阻止插入。

這是一個悲觀的鎖定方法,適合您的用例。我假設你的選擇事務是短暫的,因爲試圖更新一些選定行的客戶正在等待選擇事務提交。

帶有版本控制的樂觀鎖定策略在「修改記錄」用例中更有用,當某些客戶端選擇某行時,花2,3或10分鐘查看/修改記錄(在用戶界面中),然後保存承諾)其修改。通過這種策略,我們不希望其他客戶等待第一個客戶來保存其修改。