触发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:
答案 0 :(得分:4)
乐观锁定异常意味着持久化的对象已经在数据库中更改了它的状态(其他一些事务保存了对象)。
因此,这是一个特定于域的问题。你必须决定应该做些什么。
基本上有两个选择:
向用户显示错误。
从数据库中读取对象并合并更改。有了这个,你应该假设你可能会失去其他交易所做的修改。
答案 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());