LockModeType.OPTIMISTIC不起作用

时间:2014-01-30 11:44:43

标签: spring hibernate java-ee optimistic-locking

当LockModeType.OPTIMISTIC_FORCE_INCREMENT执行时,LockModeType.OPTIMISTIC不起作用。

@Transactional
public void test(Integer task){

  if (task == 1) {
    em.find(Company.class, 1000059, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
  }

  if (task == 2) {
    em.find(Company.class, 1000059, LockModeType.OPTIMISTIC);
    System.out.println("waiting for task 1 ...");
    Thread.sleep(10000); // time to call task1
  }

}

我在task2中调用task1,我希望回滚task2的事务,但最后它们都被提交了。这不应该发生,因为task2对公司版本有乐观锁定,task1在中间增加它。已记录的SQL显示在事务结束时检查版本但没有回滚(JpaOptimisticLockingFailureException)。

任务2:

select ... from company where company.id=1000059

任务1:

select ... from company where company.id=1000059
update Company set version=57 where id=1000059 and version=56
commit

任务2:

select version from Company where id =1000059
commit

如果我将OPTIMISTIC更改为OPTIMISTIC_FORCE_INCREMENT,代码将正常工作,外部事务将被回滚,并且将抛出JpaOptimisticLockingFailureException。但这意味着只读事务需要更新版本,我不想要:(

我使用的是Hibernate 4.3.0.Final和Spring 4.0.0.RELEASE

1 个答案:

答案 0 :(得分:1)

通过使用

将事务隔离从REPEATABLE-READ更改为数据库级别的READ COMMITTED来解决
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

也可以通过添加line:

在persistence.xml中完成
<property name="hibernate.connection.isolation">2</property>

隔离参数可以是:

1: READ UNCOMMITTED
2: READ COMMITTED
4: REPEATABLE READ
8: SERIALIZABLE