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

时间:2012-06-07 11:01:33

标签: java spring hibernate jdbc

我想解决的问题的上下文:我有一个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个db连接。 基本上,我想知道问题的解决方案:如何使TransactionTemplate“挂起”当前事务,并在这种情况下重新使用新连接。

有什么想法吗? :)

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

1 个答案:

答案 0 :(得分:1)

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

我真的没有看到从池中获取连接,执行快速审计事务以及返回连接有什么大不了的。

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