我有一张桌子,我可以从中计算两个日期之间的当前行数,并使用我的'中的结果值来插入'同一个表中的行。
我遇到问题是当两个并发请求到达A1和A2并且想要同时存储新行时(在上面的计算之后),两者都有相同的结果,比如10行。即使A1应该有10,而A2应该有11。
两笔交易都有冲突。所以我需要锁定桌子。我知道锁定功能,
aRepository.lock(对象);
但问题是这只会锁定一行,我想锁定整个表(实体),因为我计算总行数。
请告知。
答案 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)
方法。这将锁定整个表。