spring - 使用aspectj在Spring Boot中重试死锁事务

标签 spring spring-boot proxy transactions aspectj

我通过让 2 个函数以相反的顺序锁定 mysql 表中的 2 行,造成了死锁情况。我在这两个函数上都有@Transactional。我还在这两个函数上设置了一个方面,最多重试失败的函数 2 次。

死锁后,一个线程成功,一个线程失败。失败者重试。到目前为止,一切都很好。但是,此后有 2 个问题。

  1. 当第二次重试失败的函数时,它会再次读取 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/

相关文章:

java - 从 .jar 手动启动 Spring Boot 应用程序无法正常工作

java - 使用自定义 validator 手动验证,无需默认构造函数

css - 我如何在公共(public)代理中缓存我用于标题的重图像(使用背景图像 :url css property in the stylesheet)

python - 尝试使用 aiohttp 构建代理

asp.net - 缓存 WCF 代理?

java - 有没有办法识别可反序列化的未知 jms 对象?

java - 启动应用程序时无法创建bean

mysql - 适用于 H2 和 MySQL 的相对时间查询

spring - 如何在spring jpa中以一对多关系插入数据

java - Spring - 配置属性用法