通常,我们使用Spring + Atomikos来管理JTA会话并将hibernate.auto_close_session设置为true。 现在,如果我们手动打开无状态会话(对于某些异步作业):
StatelessSession sl = sessionFactory.openStatelessSession();
我们如何关闭StatelessSession?如果我们打电话
sl.close()
然后“currentSession”将回滚。 如果我们注释
@Transactional(propagation = Propagation.NOT_SUPPORTED)
在使用StatelessSession的方法上,提交挂起,Atomikos日志显示它不断产生新事务并且永不停止。
完整代码:
public Vendor findByCode(String code) {
StatelessSession slsession = null;
Transaction tx = null;
try {
slsession = getStatelessSession();
tx = slsession.beginTransaction();
return (Vendor) slsession.createQuery("from Vendor"
+ " where code = :code")
.setParameter("code", code)
.uniqueResult();
} catch (HibernateException e) {
e.printStackTrace();
return null;
} finally {
if (slsession != null && tx != null) {
tx.commit();
slsession.close();
}
}
}
已经有一个Spring托管会话,并调用了这个方法。
你能说出什么问题吗?
答案 0 :(得分:0)
很老的未回答的问题,但在这里可能是一个答案: 您必须回滚事务,但无需关闭会话。除非你真的想要。
有些工具可以阻止您在代码中使用此类注释,但这更像是这样:
function cons(ar) {
var cnt = 0;
ar.forEach(function (i, idx) {
if (idx > 0) {
if (i == (ar[idx - 1] + 1)){
cnt++;
}
else {
if (cnt < 2)
cnt = 0;
}
}
});
return cnt < 2;
}
console.log('expected true', cons([1, 2, 5, 6, 9]));
console.log('expected false', cons([0, 2, 3, 4, 6, 9]));
console.log('expected false', cons([1, 2, 3, 4, 6, 9]));