The code that triggers the OptimisticLockingFailureException:
@Test
public void shouldIncrementUserTotalLikesByOne() throws IllegalArgumentException, UserNotFoundException { databuilderService.createAll(); User user = userService.findByEmail("[email protected]"); 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:
3 Answers
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 versionThis blog article gives more details:
Optimistic locking exception means the object being persisted have already changed it's state in the database (some other transaction saved the object).
So, this is a domain specific problem. You have to decide what should be done.
Basically two options:
Present the error to the user.
Read the object from database and merge the changes. With this you should assume that you may lose the modifications done by other transactions.
I resolved OptimisticLockingFailureException which occurred while writing test case, actually I committed mistake of saving entity twice, userService.save(user); this statement is already written inuserService.incrementUserTotalLikesByOne(user.getId());