【发布时间】:2014-06-25 14:33:42
【问题描述】:
我正在创建一个休眠 Session 并尝试启动一个新的 [Jta]Transaction。但是,事务无法启动,因为在后台使用的 JtaTransaction 似乎已回滚。
这就是我正在做的事情。
Session session = sessionFactory.openSession();
CustomSessionWrapper dpSession = new CustomSessionWrapper(session, this);
if (!session.isClosed() && !session.getTransaction().isActive()) {
session.beginTransaction();
}
尽管如此,在调用beginTransaction 之后事务仍然不活动。当我调试beginTransaction方法时,我来到JtaTransaction的doBegin方法(我不重写这个方法,我只是贴出这个方法的原始代码)。
@Override
protected void doBegin() {
LOG.debug( "begin" );
userTransaction = locateUserTransaction();
try {
if ( userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION ) {
userTransaction.begin();
isInitiator = true;
LOG.debug( "Began a new JTA transaction" );
}
}
catch ( Exception e ) {
throw new TransactionException( "JTA transaction begin failed", e );
}
}
userTransaction.getStatus() 返回Status.STATUS_ROLLEDBACK 并且没有事务启动。有谁知道我该如何解决这个问题?
更新 1(您可以跳过,因为这是一个错误,请参阅更新 2)
我发现有两个线程,一个使用主会话,另一个使用较小的会话进行日志记录。主会话(和事务)打开的时间更长,所以基本上直到操作完成。似乎locateUserTransaction 总是返回相同的userTransaction。这意味着主会话打开此 userTransaction 并且其中一个侧事务提交/回滚该事务。有谁知道该怎么做才能检索到不同的交易?
更新 2
我发现我没有两个线程,只有一个线程并行打开两个会话。然后每个会话都应该打开自己的事务,尽管两者都获得相同的 UserTransaction。我如何告诉 hibernate 每个会话都应该有自己的 [User]Transaction?
【问题讨论】:
-
您是否在应用程序的每个位置都关闭了会话?
-
是的,当调用
CustomSessionWrapper类的commit或rollback方法时会话总是关闭。