在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(设置)”在这一行代码,我没有看到任何变化的数据库在这一点。那么,如何在数据库级别确保锁定呢?
发布于 2017-11-03 15:23:01
乐观锁定是一种读取记录的策略,在将记录写回之前,使用版本号检查版本没有更改。当您将记录写回时,您将过滤版本上的更新,以确保它是原子的。
悲观锁定是指将记录锁定以供独占使用,直到完成为止。它比乐观锁定具有更好的完整性,但要求您在应用程序设计时小心,以避免死锁。
更好的解释here。
这意味着,由于您使用了乐观锁定,所以不会在数据库级别干预锁。您所做的只是使用数据库来保持对象-实体的版本控制。例如:
( a)您从第一个jvm中打开一个T1事务,并使用v1版本读取一个对象。
b)您从第二个jvm中打开一个T2事务,并使用v1读取同一个对象。(该对象中没有更新)。
c)在T1事务中更新对象并设置其版本v2。你提交交易。
( d)您尝试在db中再次访问对象,但由于版本控制,您得到了一个异常。
但是,对于这两个事务,不需要从同一个jvm访问。
https://stackoverflow.com/questions/47095652
复制相似问题