java - 了解 jpa 锁与事务隔离级别

标签 java jpa isolation-level locks

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

最佳答案

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

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

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

关于java - 了解 jpa 锁与事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31674786/

相关文章:

java - Spring事务并插入数据库

linux - 提供 root 访问权限,但不提供 DB 访问权限

java - java中 boolean 值的位深度是多少?

java - 在 Spring MVC 项目中设置 Tiles 页面的标题

java - 在 Spring 中使用自定义解析器返回 HTTP 状态 BAD_REQUEST

orm - JPA中原生查询的字段值

java - 错误 gps requestLocationUpdates android

java - Spring REST - 从实体构建链接

Hibernate 资源池关闭过早

mysql - 来自 Django select_for_update 的锁定记录是否受更新值的影响