2014-06-08 66 views
0

我想了解中的Optimistic Lock是什麼,它是如何正確使用的。樂觀鎖定 - Hibernate的併發問題

我的第一個問題是,它是否只關心的是,當一個Thread試圖堅持一個Object,而另一個已在此期間已經改變了相同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 。假設每個線程excecutes下面的代碼:

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); 

顯而易見的是,如果一個線程更新這是由其他線程堅持返回到其初始狀態的Objectorder,然後將數據,因爲最後一個線程不知道有關更新的任何信息。 (正如已經承認的那樣,它是錯誤設計的結果database-model

1)如果多個Threads可以同時超出此代碼,確保併發安全性的最佳方法是什麼? Optimistic Lock可以在這裏應用嗎?

2)如果一個Thread(用戶)也可以修改原來屬於其他用戶的數據,那麼上一個問題的答案是什麼?

回答

1

當您使用支持事務的數據庫時,併發訪問問題將遠離Java代碼(如果您正確使用數據庫訪問工具)並且應該由數據庫和鎖定策略來處理。

我明白你閱讀這篇文章,例如: http://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html

如果沒有 - 第一次讀到它。

其主要思想是,當您使用hibernate時,您通過Session對象與數據庫進行通信,該對象不是線程安全的並且應該是線程受限的,這意味着 - 不要在線程之間使用它,每個線程會話。如果你這麼做,那麼很好 - 你需要的是決定你使用哪種策略進行鎖定 - 樂觀或悲觀的鎖定。

樂觀是更加用戶友好的,因爲例如所有用戶都可以讀取和編輯數據,但是當兩個人同時編輯數據時,第一個數據會勝出,第二個數據必須重新輸入數據。沒關係,當你有一個有2個文本框的小表格,但不是真的,當你有5000個字符的文本區域來填充。在第二種情況下,您希望使用悲觀鎖定並使用適合您需要的鎖定級別。