gpt4 book ai didi

java - 乐观锁 - Hibernate 的并发问题

转载 作者:行者123 更新时间:2023-12-01 12:52:38 32 4
gpt4 key购买 nike

我想了解什么Optimistic LockHibernate以及如何正确使用它。

我的第一个问题是它是否只关心 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 。假设每个Thread执行以下代码:

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/en-US/html/ch05.html

如果没有 - 请先阅读。

主要思想是,当您使用 hibernate 时,您通过 Session 对象与数据库进行通信,这不是线程安全的,应该是线程限制的,这意味着 - 不要在线程之间使用它,每个线程 session 。如果您这样做,那就太好了 - 您所需要的只是决定使用哪种策略来锁定 - 乐观锁定或悲观锁定。

乐观是更用户友好的,因为例如所有用户都可以读取和编辑数据,但是当两个人同时编辑数据时,第一个获胜,第二个必须重新输入他的数据。当您有一个带有 2 个文本框的小表单时,这是可以的,但当您有 5000 个字符的文本区域需要填充时,就不行了。在第二种情况下,您希望使用悲观锁定并使用适合您需要的锁定级别。

关于java - 乐观锁 - Hibernate 的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24108380/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com