我引入了一个 TransactionService,我在控制器中使用它来执行乐观事务。它应该
- 尝试执行给定的事务(=关闭)
- 如果失败则回滚
- 如果失败再试一次
它基本上看起来像这样:
class TransactionService {
transactional = false // Because withTransaction is used below anyway
def executeOptimisticTransaction(Closure transaction) {
def success = false
while (!success) {
anyDomainClass.withTransaction { status ->
try {
transaction()
success = true
} catch(Exception e) {
status.setRollbackOnly()
}
}
}
}
}
它有点复杂,例如,它在重试之前使用不同的 Thread.sleeps 并在某个阶段中止,但这并不重要。它是从传递事务以作为闭包安全执行的控制器调用的。
我的问题:当服务由于并发更新而遇到 org.hibernate.StaleObjectStateException 时,它会继续重试,但异常永远不会消失。
我已经尝试了不同的方法,例如在控制器传递的事务中重新附加域类,清除服务或控制器中的会话,但没有帮助。我错过了什么?
我应该注意到,当我尝试在使用 status.createSavepoint() 调用 transaction() 之前插入 savePoint 时,我收到一个错误,即“事务管理器不允许嵌套事务”。我尝试了这个,因为我还怀疑存在错误,因为事务是从控制器传递到服务的,并且我需要启动一个新的/嵌套事务来避免它,但是由于错误表明这在我的情况下是不可能的。
或者也许将交易作为闭包传递是问题?
我假设在 .withTransaction 之前使用的域类无关紧要,或者是吗?