如何在JPA实体管理器中锁定整个实体(表)

时间:2014-05-27 09:41:43

标签: hibernate jpa locking entity

我有一张桌子,我可以从中计算两个日期之间的当前行数,并使用我的'中的结果值来插入'同一个表中的行。

我遇到问题是当两个并发请求到达A1和A2并且想要同时存储新行时(在上面的计算之后),两者都有相同的结果,比如10行。即使A1应该有10,而A2应该有11。

两笔交易都有冲突。所以我需要锁定桌子。我知道锁定功能,

  

aRepository.lock(对象);

但问题是这只会锁定一行,我想锁定整个表(实体),因为我计算总行数。

请告知。

2 个答案:

答案 0 :(得分:2)

据我所知,你无法用JPA锁定整个表格。 但是当然你可以使用本机查询来做到这一点。 为什么不在你的实体中使用这样的序列:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

您可以并行工作,而不是一个接一个地运行。

如果你真的坚持一个接一个地制作,你也可以有一个小列,一列一行。在那里你可以使用

aRepository.lock(Object);

但我不建议这样做。

答案 1 :(得分:0)

使用entityManager.find(yourClass.class , your-primary-key, LOCK_MODE)方法。这将锁定整个表。