我在多租户(独立的物理盒子)上运行多线程应用程序。一种功能是在这种情况下,如果在同一时间t1上有两个交易Tr1和Tr2来自不同的租户,则为客户更新余额,则它无法正确更新余额。我无法将其作为多租户进行同步,因此边界是一台机器上的JVM。
技术:Spring,hibernate和MS SQL。
我想阻止应用程序线程tr2(租户1上的线程)读取数据(同一位客户的课程)并在tr1(另一个租户上的线程)线程已经在处理它时对其进行处理。
答案 0 :(得分:1)
您可以使用以下两种方法之一:
乐观锁定:JPA不会创建额外的锁定,而是使用版本列来确保其更新的值与最初加载的值相同,如果不是,则抛出异常。
您可以通过添加版本属性(即带有@Version
批注的列)来启用该功能。当然,您将必须捕获结果OptimisticLockException
并采取相应措施(可能再试一次)。
悲观锁定:JPA将在数据库行上创建一个锁定,因此在JPA提交之前,任何更改都无法更改。