LockModeType.OPTIMISTIC不工作,而LockModeType.OPTIMISTIC_FORCE_INCREMENT工作。
@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中调用了task2,我希望task2的事务会被回滚,但最终两者都被提交了。这种情况不应该发生,因为task2对公司的版本持乐观态度,而task1则在中间增加。已记录的SQL显示,在事务结束时会检查版本,但没有回滚(JpaOptimisticLockingFailureException)。
Task2:
select ... from company where company.id=1000059Task1:
select ... from company where company.id=1000059
update Company set version=57 where id=1000059 and version=56
commitTask2:
select version from Company where id =1000059
commit如果我将乐观改为OPTIMISTIC_FORCE_INCREMENT,代码将正常工作,外部事务将被回滚,JpaOptimisticLockingFailureException将被抛出。但这意味着只读事务需要更新版本,我不想:(
我使用Hibernate 4.3.0. using和Spring4.0.Hibernate
发布于 2014-04-30 11:58:00
通过将事务隔离从可重复读取更改为在数据库级别上提交的读取,使用
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED这也可以在persistence.xml中通过添加行来完成:
<property name="hibernate.connection.isolation">2</property>其中隔离参数可以是:
1: READ UNCOMMITTED
2: READ COMMITTED
4: REPEATABLE READ
8: SERIALIZABLEhttps://stackoverflow.com/questions/21455597
复制相似问题