如果是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(设置);"在代码的这一行,我没有看到数据库的任何变化。那么在数据库级别如何确保锁定?
答案 0 :(得分:1)
乐观锁定是一种策略,您可以在该策略中读取记录,使用版本号在写回记录之前检查版本是否未更改。当你写回记录时,你过滤版本的更新,以确保它是原子的。
悲观锁定是指在您完成操作之前锁定专用的记录。它具有比乐观锁定更好的完整性,但要求您小心应用程序设计以避免死锁。
更好的解释here。
这意味着,由于您使用乐观锁定,因此不会干预数据库级别的锁定。你所做的只是使用数据库来保持对象实体的版本控制。例如:
a)您从第一个jvm打开T1事务并读取版本为v1的对象。
b)你从第二个jvm打开一个T2事务,用v1读取同一个对象。(此对象没有更新)。
c)在T1事务中更新对象并设置其版本v2。你提交交易。
d)您尝试在db中再次访问该对象,但由于版本控制而出现异常 但是没有必要从同一个jvm访问2次交易