gpt4 book ai didi

java - 如何仅使用一个连接在 hibernate 中执行嵌套事务?

转载 作者:行者123 更新时间:2023-11-30 04:46:00 25 4
gpt4 key购买 nike

我想解决的问题上下文:我有一个java spring http拦截器AuditHttpCommunicationInterceptor,它审计与外部系统的通信。执行通信的 HttpClieant 在 java 服务类中使用,该服务类执行一些称为 DoBusinessLogicSevice 的业务逻辑。DoBusinessLogicSevice 打开一个新事务,并使用几个协作者完成大量工作。

要解决的问题:无论 DoBusinessLogicSevice 中任何操作的结果如何(意外异常等),我都希望通过 AuditHttpCommunicationInterceptor 将审核存储在数据库中。

我使用的解决方案:AuditHttpCommunicationInterceptor 将以这种方式打开一个新事务:

    TransactionDefinition transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
new TransactionTemplate(platformTransactionManager, transactionDefinition).execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// do stuff
}
});

一切正常。当 DoBusinessLogicSevice 的一部分抛出意外异常时,其事务将回滚,但 AuditHttpCommunicationInterceptor 会设法将审核存储在数据库中。

此解决方案出现的问题:AuditHttpCommunicationInterceptor 使用新的数据库连接。因此,对于每个 DoBusinessLogicSevice 调用,我需要 2 个数据库连接。基本上,我想知道问题的解决方案:在这种情况下,如何使 TransactionTemplate “挂起”当前事务并重用新事务的连接。

有什么想法吗? :)

附注一个想法可能是采用不同的设计方法:删除拦截器并创建一个直接在 DoBusinessLogicSevice 中使用的 AuditingHttpClient (不是由 spring 调用),但我不能这样做,因为我无法访问其中的所有 http 字段。

最佳答案

Spring 支持嵌套事务(propagation="NESTED"),但这实际上取决于数据库平台,我不相信每个数据库平台都能够处理嵌套事务。

我真的不明白从池中获取连接、进行快速审核事务并返回连接有什么大不了的。

更新:虽然 Spring 支持嵌套事务,但 Hibernate 似乎不支持。如果是这种情况,我会说:使用另一个连接进行审核。

关于java - 如何仅使用一个连接在 hibernate 中执行嵌套事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10930496/

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