悲观锁定中的OptimisticLockException

vul*_*ul6 9 java spring hibernate java-ee

我正在使用Spring和Hibernate.我正在运行jUnit测试,如下所示:

String number = invoiceNumberService.nextInvoiceNumber();
Run Code Online (Sandbox Code Playgroud)

和invoiceNumberService方法是:

InvoiceNumber invoiceNumber = invoiceNumberRepository.findOne(1L);
Run Code Online (Sandbox Code Playgroud)

它使用简单的spring数据存储库方法,并且运行良好.但是当我重写此方法以使用锁定时:

@Lock(LockModeType.PESSIMISTIC_READ)
@Override
InvoiceNumber findOne(Long id);
Run Code Online (Sandbox Code Playgroud)

我收到"javax.persistence.OptimisticLockException:Row被另一个事务更新或删除"

我无法理解为什么它的乐观锁定异常,而我使用的是悲观锁定?当另一个交易正在改变这个实体时,这个部分在哪里?我已经挖了很多类似的问题,我非常绝望.感谢您的帮助

解决方案:
问题出在我的测试类的init函数中:

@Before
public void init() {
    InvoiceNumber invoiceNumber = new InvoiceNumber(1);
    em.persist(invoiceNumber);
    em.flush();
}
Run Code Online (Sandbox Code Playgroud)

缺乏

em.flush();
Run Code Online (Sandbox Code Playgroud)

这将数据保存到数据库中,因此findOne()现在可以对其进行检索

Mos*_*our 0

问:dao或者service层有没有给@transcational注解?发生这种情况的原因是两个事务同时尝试更改同一个表的数据。因此,如果您从 dao 层中删除所有注释并放入服务层,它应该可以解决我的问题...因为我面临类似的问题。希望能帮助到你。