如何只使用一个连接在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却没有。 如果是这种情况,我说:用另一个连接进行审核。
- “在注释ConcurrentHashMap时,在hibernate中非法尝试将非集合映射为@OneToMany,@ ManyToMany或@CollectionOfElements”
- 将Hibernate结果转换为对象列表
- Hibernate order by nulls last
- Bitronix + Spring + Hibernate + Persistence
- 许多关系的jpa标准
- 如何在不将完整文件加载到内存的情况下将大文件插入BLOB(Oracle)?
- 为什么hibernate将HibernateException更改为(未选中)RuntimeException
- JPAinheritanceentitymanager.find生成ClassCastException
- 在Hibernate Envers中获取以前版本的实体