当另一个事务正在进行时,阻止应用程序线程读取数据库

时间:2018-09-07 04:19:22

标签: hibernate transactions spring-data-jpa

我在多租户(独立的物理盒子)上运行多线程应用程序。一种功能是在这种情况下,如果在同一时间t1上有两个交易Tr1和Tr2来自不同的租户,则为客户更新余额,则它无法正确更新余额。我无法将其作为多租户进行同步,因此边界是一台机器上的JVM。

技术:Spring,hibernate和MS SQL。

我想阻止应用程序线程tr2(租户1上的线程)读取数据(同一位客户的课程)并在tr1(另一个租户上的线程)线程已经在处理它时对其进行处理。

1 个答案:

答案 0 :(得分:1)

您可以使用以下两种方法之一:

乐观锁定:JPA不会创建额外的锁定,而是使用版本列来确保其更新的值与最初加载的值相同,如果不是,则抛出异常。

您可以通过添加版本属性(即带有@Version批注的列)来启用该功能。当然,您将必须捕获结果OptimisticLockException并采取相应措施(可能再试一次)。

悲观锁定:JPA将在数据库行上创建一个锁定,因此在JPA提交之前,任何更改都无法更改。

请参见the reference documentation of Spring Data JPA

这里是related question about how to achieve that