The code that triggers the 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);
}
The exception occurs when UserService.save()
is called:
org.springframework.dao.OptimisticLockingFailureException: Optimistic lock exception on saving entity:
Best Solution
I had a problem with my model. I added @Version annotation but by mistake there was wrong type of the field and the conversion process occurred during writing to MongoDB throwing OptimisticLockingFailureException exception.
The change @Version annotated field form long type to Long class resolved my problem:
This blog article gives more details: https://aodcoding.wordpress.com/2015/07/06/preventing-lost-updates-in-mongo-with-spring-optimistic-locking/