java - @Transactional(isolation = Isolation.SERIALIZABLE) 重试机制

标签 java spring hibernate spring-boot transactional

 @Transactional(isolation = Isolation.SERIALIZABLE)

我在我的 spring 项目中的几个方法上有这个注释。如果由于“序列化访问问题”而出现异常,如果我想重试特定事务,最好的方法是什么。有注释 @Retryable 但我不太清楚如何使用它以便事务将回滚然后仅针对该特定异常重试并仅针对其他运行时异常进行回滚。提前致谢。

最佳答案

一个简单的解决方案是使用一个方法作为执行逻辑的“入口点”;它将实际逻辑委托(delegate)给事务方法。通常,一个很好的方法是让一个类具有 Transactional 注释并完成工作,另一个类是客户端与该委托(delegate)进行交互的接口(interface);提供一种间接形式。

private static final int MAX_RETRY = 5;
public void doWork(T... parameters) {
    doWork(0, parameters);
}

private void doWork(int retryLevel, T... parameters) {
    if (retryLevel == MAX_RETRY) {
        throw new MaximumRetryCountException(); //or any other exception
    } else {
        try {
           //Get your Spring context through whatever method you usually use
           AppContext().getInstance().getBean(classInterestedIn.class).doTransactionalMethod(parameters);
        } catch (ExceptionToRetryFor e) {
            doWork((retryLevel + 1), parameters);
        }
    }
}

@Transactional(isolation = Isolation.SERIALIZABLE)
public void doTransactionalMethod(parameters) {
    ...
}

请注意,您可能会在从同一类中的不同方法调用事务方法时遇到问题(即调用 this.doTransactionalMethod()),因此事务方法的调用是通过 Spring Application Context 进行的。这是由于 Spring AOP 包装类以参与事务语义的方式。请参阅:Spring @Transaction method call by the method within the same class, does not work?

关于java - @Transactional(isolation = Isolation.SERIALIZABLE) 重试机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032273/

相关文章:

java - 计算属性未由 Hibernate 填充

java - 为什么并发练习书中的SafePoint类标记为@ThreadSafe?

java - 棋盘游戏有效的移动方法始终允许移动。为什么会这样呢?

java - 无需调用 Session 对象上的 save() 方法即可持久保存对象

java - 找到 Spring 资源但未加载任何 bean

Spring 与 JMS 和 DB 的集成和事务

java - Hibernate 抛出一个预期的 OPEN,发现 '+'

java - 如何使用 Java 邮件标记跟进

java - 如何在 Selenium WebDriver 中切换回父窗口?

java - spring-boot 项目给出 "Application run failed"错误