我想了解中的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);
显而易见的是,如果一个线程更新这是由其他线程坚持返回到其初始状态的Object
order
,然后将数据,因为最后一个线程不知道有关更新的任何信息。 (正如已经承认的那样,它是错误设计的结果database-model
)
1)如果多个Threads
可以同时超出此代码,确保并发安全性的最佳方法是什么? Optimistic Lock
可以在这里应用吗?
2)如果一个Thread
(用户)也可以修改原来属于其他用户的数据,那么上一个问题的答案是什么?