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

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

要解决的问题:无论DoBusinessLogicSevice中的任何操作的结果如何(意外的exception等),我都希望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的一部分抛出意外exception时,其事务将被回滚,但AuditHttpCommunicationInterceptor会将审计存储在数据库中。

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

有任何想法吗? 🙂

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

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

我真的没有看到从池中获取连接,执行快速审计事务以及返回连接的重要事项。

更新:虽然Spring支持嵌套事务,但看起来Hibernate却没有。 如果是这种情况,我说:用另一个连接进行审核。