我们决定在我们的 Web 应用程序中使用乐观锁定以提高并发性,而不使用悲观锁定。
我们现在正在寻找重试解决方案。
我们希望对当前代码库的影响尽可能小。
我们在网上看到的一种解决方案是使用带有注释的重试拦截器将方法标记为可重试。
问题是我们想注释带有@Transactional 注释的方法,但拦截器由于某种原因无法重试它们。 (拦截器完美重试非事务方法。)
所以:
1) 是否有任何对我们的代码影响最小的重试替代方案?
2) 是否有该解决方案的文档\教程?
3) 是否可以重试 @Transactional 注释的方法?
干杯!
最佳答案
广告 3.
您可以使用 Spring Retry当版本号或时间戳检查失败(发生乐观锁)时重试 transacted 方法。
配置
@Configuration
@EnableRetry
public class RetryConfig {
}
用法
@Retryable(StaleStateException.class)
@Transactional
public void doSomethingWithFoo(Long fooId){
// read your entity again before changes!
Foo foo = fooRepository.findOne(fooId);
foo.setStatus(REJECTED) // <- sample foo modification
} // commit on method end
使用 @Transactional (propagation = Propagation.REQUIRES_NEW)
仅重试注释方法中的代码。
关于java - 乐观锁的重试机制(spring data + JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21672428/