当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
答案 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