【发布时间】:2021-06-07 07:26:53
【问题描述】:
我正在尝试为优化锁定实施通用解决方案。我想要实现的是在记录的版本更改时运行一段特定的代码。我将它实现为一个寻找DataChangedException 的ExecuteListener 实例。它已注册为 Spring bean。
class LockingListener : DefaultExecuteListener() {
override fun exception(ctx: ExecuteContext) {
val exception = ctx.exception()
if (exception is DataChangedException) {
ctx.exception(IllegalStateException("Accessed data has been altered mid-operation."))
}
}
}
@Configuration
class JooqConfig {
@Bean
fun lockingListenerProvider() = DefaultExecuteListenerProvider(LockingListener())
}
我在org.jooq.impl.ExecuteListeners#get 中设置了一个断点,它看起来确实与LoggerListener 和JooqExceptionTranslator 一起被拾取。
但是,当我尝试运行测试用例时,DataChangedException 不会在 UpdateableRecord#update 上被选中,而是得到以下堆栈跟踪,看不到 IllegalStateException。
org.jooq.exception.DataChangedException: Database record has been changed or doesn't exist any longer
at org.jooq.impl.UpdatableRecordImpl.checkIfChanged(UpdatableRecordImpl.java:540)
at org.jooq.impl.UpdatableRecordImpl.storeMergeOrUpdate0(UpdatableRecordImpl.java:349)
at org.jooq.impl.UpdatableRecordImpl.storeUpdate0(UpdatableRecordImpl.java:241)
at org.jooq.impl.UpdatableRecordImpl.access$100(UpdatableRecordImpl.java:89)
at org.jooq.impl.UpdatableRecordImpl$2.operate(UpdatableRecordImpl.java:232)
at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:149)
at org.jooq.impl.UpdatableRecordImpl.storeUpdate(UpdatableRecordImpl.java:228)
at org.jooq.impl.UpdatableRecordImpl.update(UpdatableRecordImpl.java:165)
调试显示LockingListener#exception甚至没有进入。
【问题讨论】: