如何解决optimisticlockingfailureexception?

bogh5gae  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(1340)

触发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:

iyr7buue

iyr7buue1#

乐观锁定异常意味着被持久化的对象已经改变了它在数据库中的状态(其他事务保存了该对象)。
所以,这是一个特定领域的问题。你必须决定该做什么。
基本上有两种选择:
向用户显示错误。
从数据库读取对象并合并更改。这样,您应该假设您可能会丢失其他事务所做的修改。

yr9zkbsy

yr9zkbsy2#

我的模型有问题。我添加了@version annotation,但由于错误,字段的类型不正确,转换过程在写入mongodb时发生,引发optimisticlockingfailureexception。
将@version注解字段从long type更改为long class解决了我的问题:

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/

x33g5p2x

x33g5p2x3#

我解决了写测试用例时出现的optimisticlockingfailureexception,实际上我犯了两次保存实体的错误, userService.save(user); this statement is already written in userservice.incrementUserTotalIkesByOne(user.getid());

相关问题