如何解决OptimisticLockingFailureException?

Gir*_*mar 1 java mongodb testcase spring-data

触发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);
}
Run Code Online (Sandbox Code Playgroud)

发生以下情况时会发生异常UserService.save()

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

Cri*_*scu 6

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

所以,这是一个特定领域的问题。你必须决定应该做什么。

基本上有两种选择:

  1. 将错误呈现给用户。

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


小智 5

我的模型有问题。我添加了@Version批注,但是由于错误而导致字段类型错误,并且在写入MongoDB期间引发了OptimisticLockingFailureException异常,因此发生了转换过程。

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

import org.springframework.data.annotation.Version

@Version
private Long version
Run Code Online (Sandbox Code Playgroud)

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