gpt4 book ai didi

java - 同一实体的并发更新

转载 作者:行者123 更新时间:2023-11-29 03:23:23 29 4
gpt4 key购买 nike

先生们/女士们,

我遇到了同一实体的并发更新问题。

进程 1 获取对象集合。为了性能,这个过程没有使用 Hibernate 来检索数据,这对我来说听起来有点牵强。此过程还使用 Hibernate 更新集合中某些对象的某些字段。

进程 2 获得一个与集合中的对象相似的对象(基本上是数据库中的同一行)并以某种方式更新它。此过程使用 Hibernate。

由于进程 1 和进程 2 彼此不了解,它们可以更新同一个实体,使其处于非一致状态。

例如:

  1. 进程1获取集合
  2. 进程 2 获得一个实体并删除它的一些属性以及它链接到的实体
  3. 进程 1 返回并尝试保存该实体并获取实体未找到异常

我需要处理这种情况。

那么可以做什么呢?

目前我看到两种方式:

  1. 在数据库之上创建层,以跟踪系统中的每个实体,有效地禁止创建同一实体的多个实例
  2. 设置乐观锁,因为一些实体不是由 Hibernate 获得的,所以我需要以不同的方式实现它

任何想法都会很有帮助

提前致谢

最佳答案

Since process 1 and process 2 don't know about each other they can update the same entity, leaving it in non-consistent state.

我会重新表述:两个进程可以更新相同的数据。只有 Hibernate 知道实体,而其他进程似乎通过 JDBC 访问数据。

我会选择选项 2,它会涉及您实体中的版本列。然后,IIRC Hibernate 会向查询添加一个 WHERE version = x 条件,并检查是否所有行都已更新,如果没有,则会抛出一个 OptimistictLockException。您可以在 JDBC 查询中执行相同的操作,即 UPDATE ... SET ... version = x + 1 ... WHERE version = x AND additionalConditions 并检查返回的更新行数通过 JDBC。

关于java - 同一实体的并发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22376282/

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