理解JPA锁与事务隔离级别

5

我试图理解这些概念之间的关系。JPA锁是从Java向数据库提供/调用事务隔离级别的方式吗?还是它们是分开的机制,那么它们的目的有什么区别?

1个回答

11

锁定是指防止多个用户同时更新实体。 有两种不同的锁定机制。在悲观锁定场景中,在执行更新操作之前,必须由用户锁定表中的行,并且其他用户将无法对目标实体执行更新。在行更新后,必须解除该表的锁定,以便其他用户也可以修改目标记录。另一个选择是使用乐观锁定。在这样的实现中,每个实体都有一个版本列(在JPA中可以使用@Version)。如果用户更新了实体,则其值或时间戳也会更新。如果另一个用户使用过时值的实体进行更新,则会引发OptimisticLockException异常,用户或应用程序必须获取新实体并合并更改。 需要此功能以防止实体丢失更新,其中最后一次提交将覆盖所有其他更改。

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

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


2
那个“数据库读取的一致性”部分真的帮了我很多。 - Roeniss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接