簡體   English   中英

樂觀鎖-Hibernate的並發問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM