如何解决OptimisticLockingFailureException?

时间:2015-01-15 10:30:19

标签: java mongodb spring-data testcase

触发OptimisticLockingFailureException的代码:

@Test
public void shouldIncrementUserTotalLikesByOne() throws IllegalArgumentException, UserNotFoundException {
    databuilderService.createAll();

    User user = userService.findByEmail("abc@gmail.com");

    long numberOfLikeCount = user.getLikeCount(); 

    userService.incrementUserTotalLikesByOne(user.getId()); 

    userService.save(user);

    long numberOfUpdatedUpdatedCount = user.getLikeCount(); 

    Assert.assertNotNull(numberOfUpdatedUpdatedCount);

    Assert.assertEquals(numberOfUpdatedUpdatedCount, numberOfLikeCount+1);
}

调用UserService.save()时会发生异常:

org.springframework.dao.OptimisticLockingFailureException: Optimistic lock exception on saving entity:

3 个答案:

答案 0 :(得分:4)

乐观锁定异常意味着持久化的对象已经在数据库中更改了它的状态(其他一些事务保存了对象)。

因此,这是一个特定于域的问题。你必须决定应该做些什么。

基本上有两个选择:

  1. 向用户显示错误。

  2. 从数据库中读取对象并合并更改。有了这个,你应该假设你可能会失去其他交易所做的修改。

答案 1 :(得分:3)

我的模型有问题。我添加了@Version注释,但错误的是字段类型错误,并且在写入MongoDB期间发生了转换过程,抛出了OptimisticLockingFailureException异常。

将@Version注释字段类型更改为类解决了我的问题:

import org.springframework.data.annotation.Version

@Version
private Long version

此博客文章提供了更多详细信息:https://aodcoding.wordpress.com/2015/07/06/preventing-lost-updates-in-mongo-with-spring-optimistic-locking/

答案 2 :(得分:0)

我解决了在编写测试用例时发生的OptimisticLockingFailureException,实际上我犯了两次保存实体的错误,userService.save(user); this statement is already written in userService.incrementUserTotalLikesByOne(user.getId());