首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LockModeType.OPTIMISTIC不工作

LockModeType.OPTIMISTIC不工作
EN

Stack Overflow用户
提问于 2014-01-30 11:44:42
回答 1查看 515关注 0票数 2

LockModeType.OPTIMISTIC不工作,而LockModeType.OPTIMISTIC_FORCE_INCREMENT工作。

代码语言:javascript
复制
@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:

代码语言:javascript
复制
select ... from company where company.id=1000059

Task1:

代码语言:javascript
复制
select ... from company where company.id=1000059
update Company set version=57 where id=1000059 and version=56
commit

Task2:

代码语言:javascript
复制
select version from Company where id =1000059
commit

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

我使用Hibernate 4.3.0. using和Spring4.0.Hibernate

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-30 11:58:00

通过将事务隔离从可重复读取更改为在数据库级别上提交的读取,使用

代码语言:javascript
复制
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

这也可以在persistence.xml中通过添加行来完成:

代码语言:javascript
复制
<property name="hibernate.connection.isolation">2</property>

其中隔离参数可以是:

代码语言:javascript
复制
1: READ UNCOMMITTED
2: READ COMMITTED
4: REPEATABLE READ
8: SERIALIZABLE
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21455597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档