gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:18:50 27 4
gpt4 key购买 nike

 @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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com