休眠并发-无法隔离或锁定@OneToMany / @ManyToOne双向关系

时间:2019-10-01 21:01:01

标签: hibernate jpa

我在Hibernate(版本5.4.2)中存在并发问题:一个实体(类Group)始终具有其他实体(类Member)的准确列表,这一点很重要。我与 @OneToMany @ManyToOne @JoinColumn 使用了双向关系:

@Entity
public class Group {
  @Id
  @GeneratedValue
  private Long id;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "group")
  private Set<Member> memberList = new HashSet<>();
}

@Entity
public class Member {

  @Id
  @GeneratedValue
  private Long id;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "groupMember_id")
  private Group group;
}

作为数据库,我使用MySQL:

CREATE TABLE `Group` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE `Member` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `groupMember_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

ALTER TABLE `Member` ADD KEY `FK_2vbvsrpwxwnqbd0rud8kfr9ur` (`groupMember_id`);
ALTER TABLE `Member` ADD CONSTRAINT `FK_2vbvsrpwxwnqbd0rud8kfr9ur` FOREIGN KEY (`groupMember_id`) REFERENCES `Group` (`id`);

问题是,如果我在一个事务中将新创建的成员添加到组的memberList中,其他并发事务则看不到-它们得到了错误的memberList。

到目前为止我尝试过的事情:

  • 类似于https://www.baeldung.com/jpa-pessimistic-locking中的 LockModeType.PESSIMISTIC_WRITE (带有或不带有 PessimisticLockScope.EXTENDED )的说明,带有“查找”和“查询”。 / p>

  • 然后我尝试将<property name="hibernate.connection.isolation" value="8"/>添加到我的 persistence.xml 中。根据{{​​3}},这会将隔离级别设置为Serializable:

      

    Serializable-这是最严格的隔离级别,将存在可伸缩性问题。这样可以防止脏读,幻像读,不可重复读等。事务是串行执行的(一个接一个),并获得对整个受影响数据集的读写锁定。

0 个答案:

没有答案