java - 多个线程访问数据库 : one with long transaction, 一个带有短事务

标签 java database hibernate jpa

假设我有一个桌面应用程序可以充当一堆汽车的车库:

@Entity
public class Garage {
    private List<Car> cars = new ArrayList<Car>();
    ...
}

桌面应用程序有一个“模拟”按钮,可以启动一个新线程并开始调用 Garage、Car、Wheel 等的方法。这个模拟可能需要长达 10 分钟才能运行。目前我有一个看起来像这样的类:

beginTransaction();
Garage garage = garageDao.findGarage(1);
List<Car> cars = garage.getCars();
for (Car car : cars) {
    // call methods on the car to lazily fetch other things like wheels...
}
commitTransaction();

这段代码只做“读”,从不“写”

所以上述过程可能需要很长时间,具体取决于汽车需要维修的程度。在发生上述情况时,用户可以继续使用桌面应用程序工作。他们可以选择更改在上述交易中使用的汽车的颜色。

我的问题是上面的长交易是否会阻止汽车颜色的改变?也就是说,在长事务完成之前,用户在桌面应用程序中更改汽车颜色将无法提交更改?

最佳答案

为什么要这样?默认情况下,您使用的是乐观事务,因此不会对正在读取的行应用锁定(除非您没有向我们展示一些 JPA2 lock() 调用)。然后事务的提交应该检查记录的乐观版本(如果您定义了版本)并使用它来决定是否提交更改。

关于java - 多个线程访问数据库 : one with long transaction, 一个带有短事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4487231/

相关文章:

java - 在 hibernate 查询中返回通用对象而不是类实体

java - 如何在 try-with-resources 中正确使用 OutputStream?

java - 使用 hibernate 进行遗留映射

python - 添加到 SQLFORM.grid、Web2PY 的链接

android - 使用无操作应用程序托管数据库,以便精简版和专业版可以访问

mysql - 从 MS SQL 迁移到 MySQL : SQLOLEDB? 迁移套件登录错误?

java - 如何在 hibernate 中对关联表进行排序?

IE : require java 6, 安装 java 8 的 Java 小程序标签

java - 将 JAR 文件转换为可执行文件是否可以确保其分发?

java - Hibernate 5.4.x 由 : org. hibernate.boot.MappingException 引起:访问 stax 流时出错:origin(null)