了解JPA锁与事务隔离级别

Ale*_*sky 3 java jpa isolation-level locks

我试图理解这些概念之间的关系。jpa锁是否是从Java在DB中提供/调用事务隔离级别的方法?还是它是分开的机制,所以有什么区别(它们的目的)?

Pat*_*ann 6

锁定这意味着您可以防止多个用户同时更新实体。有两种不同类型的锁定机制。在悲观的锁定方案中,在执行更新之前,表中的行必须由用户锁定,并且其他用户将无法执行目标实体的更新。在更新行之后,必须将表解锁,以便其他用户也可以修改目标记录。另一种选择是使用乐观锁定。在这样的实现中,每个实体都有一个version列(可以使用JPA @Version)。如果实体是由用户更新的,则其值或时间戳也会被更新。如果另一个用户使用具有过期值的实体执行更新,则将引发OptimisticLockException,并且该用户或应用程序必须获取新实体并合并更改。

事务隔离级别负责数据库读取的一致性。例如,如果使用“ READ UNCOMMITTED”,则可以在事务完成之前看到数据库正在更新的更改。这意味着,如果发生错误并且事务已回滚,则另一个用户将获取从未存储在数据库中的更改。“读取已提交”将仅提供已提交的更改。

没有“完美”的隔离级别。事务隔离级别的“正确”值取决于应用程序中的用例。例如,用于时间跟踪的JIRA Tempo插件将未提交的记录标记为红色,以表明该数据处于待处理状态。

  • “数据库**读取**的一致性”部分确实对我很有帮助。 (2认同)