[英]Optimistic Lock - Concurrency issue with Hibernate
我試圖了解Hibernate
中的Optimistic Lock
的作用以及如何正確使用它。
我的第一個問題是,是否只在一個Thread
嘗試保留一個Object
而另一個Thread
同時已經更改了同一Object
的狀態時才拋出異常,還是在乎這兩個修改是否正確保存? 當對象鏈更新且每個Thread
嘗試更改的部分不同時,最后至少是正確的嗎?
我想舉一個例子,以使我對一個真實情況的疑問可以理解。 這是一個設計不良的database-model
但可以用來描述問題:
假設其中一個具有以下實體:
@Entity
public class Order{
@OneToMany
private User_Order user_Order;
}
@Entity
public class User_Order{
@OneToMany
private Product product;
}
換句話說,一個Order
包含多個User-Orders
,每個User-Order
具有多個Products
。 假設每個線程執行以下代碼:
Order order = (Order) session.get(Order.class, 1);
//some other code...
Set<User_Order> userOrders = order.getUserOrder();
User_Order myUserOrder = //find my User_Order
List<Products> products = myUserOrder.getProducts();
//modify myUserOrder
//modify products
session.update(order);
顯然,如果一個線程更新了Object
order
,那么其他線程所保留的數據將返回其初始狀態,因為最后一個線程對更新一無所知。 (正如已經承認的,這是錯誤設計的database-model
)
1)在多個Threads
可以同時執行此代碼的情況下,確保並發安全的最佳方法是什么? 可以在這里應用Optimistic Lock
嗎?
2)如果一個Thread
(用戶)也可以修改理論上屬於其他用戶的數據,那么對上一個問題的答案是什么?
當您使用支持事務的數據庫時,並發訪問的問題將轉移到Java代碼之外(如果您正確使用了數據庫訪問工具),則應由數據庫和鎖定策略來處理。
我了解您閱讀了以下文章,例如: http : //docs.jboss.org/hibernate/orm/4.0/devguide/zh-CN/html/ch05.html
如果沒有,請先閱讀。
主要思想是,當您使用休眠模式時,您是通過Session對象與數據庫進行通信的,該對象不是線程安全的,應該限制在線程范圍內,這意味着-請勿在線程之間使用,每個線程都使用會話。 如果這樣做,那么太好了-您所需要的就是確定要使用哪種策略進行鎖定-樂觀鎖定或悲觀鎖定。
樂觀對用戶更友好,因為例如所有用戶都可以讀取和編輯數據,但是當兩個家伙同時編輯數據時,第一個贏得勝利,第二個必須重新輸入數據。 可以,當您有一個帶有2個文本框的小型表單時,但不是真的,當您要填充5000個字符的文本區域時,這不是真的。 在第二種情況下,您要使用悲觀鎖定,並使用適合您需要的鎖定級別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.