java - LockModeType.OPTIMISTIC_FORCE_INCREMENT 这个锁是应用层还是数据库层

标签 java database hibernate jpa locking

如果是 hibernate jpa LockModeType.OPTIMISTIC_FORCE_INCREMENT,这个锁是在应用程序级别还是数据库级别获取的。

我正在使用以下代码片段来获取乐观锁:

setting = this.entityManager.find(Setting.class, setting.getId(), 
LockModeType.OPTIMISTIC_FORCE_INCREMENT);
setting.setUpdateTimestamp(new Date());
newSettingList.add(setting);

假设有两个 jvm 正在运行,并且都有相同的方法并且存在冲突,这种锁定机制在这种情况下是否有效?

我的观察是,每当我调试和“newSettingList.add(setting);”在代码的这一行,我当时没有看到数据库有任何变化。那么如何确保数据库级别的锁定呢?

最佳答案

乐观锁定是一种策略,您读取一条记录,在写回记录之前使用版本号检查版本是否未更改。当您写回记录时,您过滤版本上的更新以确保它是原子的。

悲观锁定是指您锁定记录以供您独占使用,直到您使用完为止。它比乐观锁定具有更好的完整性,但需要您谨慎设计应用程序以避免死锁。

更好的解释here .

这意味着由于您使用了乐观锁定,因此您无需干预数据库级别的锁。您所做的只是使用数据库来保持对象实体的版本控制。例如:

a) 您从第一个 jvm 打开一个 T1 事务并读取一个版本为 v1 的对象。

b) 您从第二个 jvm 打开一个 T2 事务并使用 v1 读取相同的对象。(此对象中未进行任何更新)。

c) 您在 T1 事务中更新对象并设置其版本 v2。您提交交易。

d) 您尝试在数据库中再次访问该对象,但由于版本控制出现异常。
但是不需要从同一个 jvm 访问这两个事务

关于java - LockModeType.OPTIMISTIC_FORCE_INCREMENT 这个锁是应用层还是数据库层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47095652/

相关文章:

java - 使用curl命令将包含base 64编码文件(大小400Mb)的json上传到spring REST接口(interface)

database - 唯一标识生成

database - 数据库的 UML 类图

java - 使用左连接从子表到父表的 Hibernate HQL

java - 标准化 Hibernate 中的重复值 - Java

java - 如何将 csv 文件中的数据打印到第二个 Activity 上?

java - 每次调用方法时如何将 1 添加到另一个类的整数?

mysql - SQL大表优化

java - 未找到 Postgresql + Hibernate 5 列但列存在

java - 当其他窗口处于 Activity 状态时,我的 java 程序卡住