我正在尝试使用重试拦截器实现基本的乐观锁定机制。

因此,有一个对象Quiz具有属性responseCount。如果在测验更新期间抛出乐观的Lock异常,则将从重试拦截器再次调用相应的update方法。

事情是不对的,因为重试的方法每次都具有相同的版本号,因此无论如何它都会使事务失败。

版本:10

流程A:
开始更新测验,版本10
流程B:
开始更新测验,版本10
流程B:
完成更新测验,版本11
流程A:
引发乐观异常引发更新测验,重试进程A
在重试方法中,版本始终为10

那我该怎么办?它应该自动增加版本以成功交易

最佳答案

乐观锁异常的处理方式如下:

首先重新读取记录,获取冲突事务写入的新版本号和更新的字段值。

然后根据新值重新应用您的操作。
在您的情况下,这很简单-递增值是顺序无关或可交换的。重新执行其他操作可能并不容易-例如,假设事务都试图将问题跟踪器中的错误从一种工作流程状态转移到另一种工作流程状态。该转换只能发生一次,因此重试事务将需要检查该转换的bug仍处于有效状态,否则,它将向用户报告错误。

09-08 07:08