我通过让 2 个函数以相反的顺序锁定 mysql 表中的 2 行,造成了死锁情况。我在这两个函数上都有@Transactional。我还在这两个函数上设置了一个方面,最多重试失败的函数 2 次。
死锁后,一个线程成功,一个线程失败。失败者重试。到目前为止,一切都很好。但是,此后有 2 个问题。
当第二次重试失败的函数时,它会再次读取 2 行。但是,第一个值是旧值,第二个值是新值。
最后,事务失败,因为事务已被标记为回滚。所以@Transactional代理是围绕重试代理的。有办法颠倒顺序吗?我尝试让重试代理继承 Ordered 并将顺序设置为 Ordered.HIGHEST_VALUE 和 Ordered.LOWEST_VALUE,但都不起作用。
最佳答案
我尝试了 spring 重试,效果非常好。不过,仍在研究它是如何发挥魔力的。
我基本上是这样做的:
添加对 org.springframework.retry spring-retry 的依赖
将@EnableRetry添加到应用程序
在上面添加@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 2000)) @Transactional 带注释的函数。
关于spring - 使用aspectj在Spring Boot中重试死锁事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689613/