Spring PROPAGATION_SUPPORTS事务只读,你需要提交吗?

时间:2014-12-02 14:20:18

标签: java spring java-ee

示例代码:

protected Session session() {
        return (Session) getEntityManager().getDelegate();
}

session().createCriteria( entityClass )

首次调用session()。createCriteria()会在没有可用事务的情况下抱怨会话已关闭。

所以我使用:

创建一个只读事务
TransactionTemplate template = new TransactionTemplate( getTransactionManager() )
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
template.setReadOnly(true);

TransactionStatus status = getTransactionManager().getTransaction(template);

我是否需要提交此交易:     。的getTransactionManager()提交(状态);

问题是,如果这已经提交,我稍后将需要另一个事务:

criteria.list(); 

并且问题在于,第二次,它是与用于获取会话的事务不同的事务,并且导致错误。它会抱怨它已经关闭了。

session()。createCriteria和criteria.list必须在它看来的同一个事务中使用。但是我的代码在方法中有这些,因此没有很好的方法来确保这些方法单独工作,除非session.createCriteria事务仍未提交。

我可以安全地保留TransactionDefinition.PROPAGATION_SUPPORTS事务未提交吗?我可以创建多少个此类交易?

1 个答案:

答案 0 :(得分:3)

不,你不能把它当作未经注册的。只读更多是对底层事务管理器的暗示,以禁止当前事务上下文中的突变。如果您以后需要访问同一个事务,也许您需要稍微改变一下设计。为什么不在方法的调用者中打开事务并在那里处理它?或者尝试基于声明或注释的方法?