gpt4 book ai didi

spring - noRollbackFor 并不总是处理未经检查的异常(不是重复的)

转载 作者:行者123 更新时间:2023-12-04 12:26:21 24 4
gpt4 key购买 nike

我见过很多类似的问题,但它们通常与我的问题无关。

这是我的代码。

@Override //class implements interface
//can also add "rollbackFor = OutOfMemoryError.class" here, to no avail
@Transactional(noRollbackFor = IllegalArgumentException.class)
public ReportTemplate getByCode(final String code)
//throws IllegalArgumentException - see question text
{
if(code == null) {
throw new IllegalArgumentException("ss");
}
}

消费者(非事务性)通过 Autowiring 接口(interface)调用此方法。
尽管 noRollbackFor 事务(仅由该方法组成)被回滚。
好的,我理解有人说“默认情况下它是回滚任何未选中的,因此由于默认值未被覆盖,该规则仍然适用”。但这不应该是真的,因为这意味着 noRollbackFor 是无用的 :) 我们可以尝试在上面的评论中指定 rollbackFor,希望它会取消“默认”rollbackFor - 但这无济于事:回滚仍然发生;看起来这个设置只是添加到“默认”。最糟糕的是,当 noRollbackFor 和 rollbackFor 涵盖相同的后代异常时,我找不到关于它应该如何工作的精确规范(例如在我的情况下,RuntimeException 与 IllegalArgumentException,谁赢了?)。

好吧,我找到了 but one official clarification它说“最强匹配规则获胜”-但这似乎并不普遍,就像我的情况一样。此外,出于某种原因,它们过于具体:他们说 no-rollback-for="InstrumentNotFoundException"字面意思是“除 InstrumentNotFoundException 之外的任何异常”都将被回滚(但是 InstrumentNotFoundException 的后代呢?)无论如何它已经过时了:2.5.x 和较新的文档只是说“rollbackFor 列出了要回滚的异常,而 noRollbackFor 列出了不要的异常”,我会说,这是一种非常矛盾的方式。

更有趣的是,如果我在“throws”子句中指定了 IllegalArgumentException,上面的代码将停止回滚。是的,我不必这样做,因为它未经检查 - 但如果我这样做了, noRollbackFor 似乎终于注意到它并表现得很好!有谁知道什么手册说这应该发生?或者也许这是一个错误?

更新 这是 spring 事务日志(在我的实际代码 YargReportTemplateDao$TemplateNotFoundException 中到处都是,而不是 IllegalArgumentException)

1) 用“ throw ”
[qtp22373939-44] TRACE org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [ru.it.p321.dao.YargReportTemplateDaoImpl.getByCode] after exception: ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[pool-28-thread-1] DEBUG org.springframework.transaction.jta.JtaTransactionManager - Initiating transaction commit
[qtp22373939-44] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[qtp22373939-44] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Winning rollback rule is: NoRollbackRuleAttribute with pattern [ru.it.p321.dao.YargReportTemplateDao$TemplateNotFoundException]

2) 没有“抛出”
[qtp21176461-48] TRACE org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [ru.it.p321.dao.YargReportTemplateDaoImpl.getByCode] after exception: org.springframework.dao.InvalidDataAccessApiUsageException: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION; nested exception is ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[qtp21176461-48] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on org.springframework.dao.InvalidDataAccessApiUsageException: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION; nested exception is ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[qtp21176461-48] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Winning rollback rule is: null
[qtp21176461-48] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - No relevant rollback rule found: applying default rules

最佳答案

您看到的行为与事务处理无关,而是与异常转换有关。默认情况下,当一个类用 @Repository 注释时Spring 会注册一个 PersistenceExceptionTranslationInterceptor这会将异常转换为 Spring DataAccessException 之一s。默认情况下,它会转换所有异常,除非抛出的异常在 throws 子句中声明。

此异常转换发生在 TransactionInterceptor 之前这样就永远不会有 IllegalArgumentException抛出,因为它已经被翻译成别的东西。

关于spring - noRollbackFor 并不总是处理未经检查的异常(不是重复的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35521822/

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