Java – How to resolve OptimisticLockingFailureException

javamongodbspring-datatestcase

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:

import org.springframework.data.annotation.Version

@Version
private Long version

This blog article gives more details: https://aodcoding.wordpress.com/2015/07/06/preventing-lost-updates-in-mongo-with-spring-optimistic-locking/