可以/应该Spring重用Hibernate Session进行子事务(REQUIRES_NEW)

时间:2012-09-17 19:57:07

标签: java spring hibernate transactions

我有一个事务服务,调用带有REQUIRES_NEW传播的第二个服务。

激活日志我看到Spring在创建子事务时创建了一个新的Hibernate Session,即使当前Thread已经有一个打开的Session。

[DEBUG] org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource.getTransactionAttribute(AbstractFallbackTransactionAttributeSource.java:106) Adding transactional method 'executeProcessed' with attribute: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; ''
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doGetTransaction(HibernateTransactionManager.java:437) Found thread-bound Session [org.hibernate.impl.SessionImpl@467743d7] for Hibernate transaction
[DEBUG] org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(AbstractPlatformTransactionManager.java:415) Suspending current transaction, creating new transaction with name [com.microsigns.ds.businesslogic.rendering.service.impl.PipelineDataServiceImpl.executeProcessed]
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:493) **Opened new Session** [org.hibernate.impl.SessionImpl@3d4b1aad] for Hibernate transaction
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:504) Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@3d4b1aad]
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:569) Exposing Hibernate transaction as JDBC transaction [jdbc:postgresql://localhost:5432/ds, UserName=microsignsdds, PostgreSQL Native Driver]

重用会话不应该在性能方面更好吗?这还可以避免在子事务中重新加载或重新附加对象。我在这里缺少什么?

此行为在org.springframework.orm.hibernate3.HibernateTransactionManager中进行了硬编码:

xObject.getSessionHolder().setSynchronizedWithTransaction(true);

我正在使用hibernate 3.6和Spring 3.1

1 个答案:

答案 0 :(得分:5)

不,它不应该重用会话。如果您需要新事务,那么您需要能够在子事务中修改,提交,回滚等所有内容。可以将休眠会话视为事务高速缓存,它保存事务数据