java - 乐观锁的重试机制(spring data + JPA)

标签 java spring hibernate jpa optimistic-locking

我们决定在我们的 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/

相关文章:

java - JPA IdClass 混淆 - 这个想法实用吗?

java - 重命名 hibernate envers id 和 timestamp 列

java - 如何在 Neo4j for java 中传递动态生成的属性名称和值列表?

java - 无法在 Spring Boot 中使用 HTTPS(未找到 PKCS12)

java - 音频转换的质量问题

Spring boot Embedded Derby 在最新版本中不起作用。

java - @AttributeOverride 不适用于 Hibernate 5

java - 如何确保 hibernate 5 在与共享主键的一对一关系中以正确的顺序持续存在

java - 如何在for循环中跳出while循环

Java GUI 打印空白页