Hibernate JTA多用户会话事务映射

时间:2014-09-11 21:08:33

标签: java hibernate session transactions

我指的是https://developer.jboss.org/wiki/SessionsAndTransactions,目前正试图了解与JTA的划分。它声明在使用getCurrentSession()的特定事务中,始终提供相同的当前会话。这是不是意味着:

  1. 如果另一个用户正在执行相同的代码(通过查找获取事务,然后在另一个线程中使用getCurrentSession()然后关闭事务) - 该用户将拥有自己的事务和他自己的当前会话,即2个用户的当前会话本身是相同的,但彼此不同?
  2. 如果1为真且基于JTA划分链接中显示的代码 - 系统(读取Hibernate)如何理解在使用getCurrentSession()时哪个会话响应哪个用户?毕竟我们不将事务作为参数传递给getCurrentSession()。
  3. 非常感谢任何指针/帮助。

    由于

1 个答案:

答案 0 :(得分:0)

根据javadoc SessionFactory.getCurrentSession()

  

究竟是什么"当前"意味着由{@link org.hibernate.context.spi.CurrentSessionContext} impl配置控制   用来。

     

JTA已配置,默认为{@link org.hibernate.context.internal.JTASessionContext} impl。

然后你可以看到JTASessionContext的javadoc和实现。

  

如果在调用{@link #currentSession()}时会话尚未与当前JTA事务关联,则将打开一个新会话,它将与该JTA事务关联。

public Session currentSession() throws HibernateException {
  ...
  final TransactionManager transactionManager = jtaPlatform.retrieveTransactionManager();
  ...
  txn = transactionManager.getTransaction();
  ...
  final Object txnIdentifier = jtaPlatform.getTransactionIdentifier( txn );
  ...
  Session currentSession = currentSessionMap.get( txnIdentifier );
  ...
}

TransactionManager javadoc

  

在内部,事务管理器将事务与线程相关联,    这里的方法对与之相关的交易进行操作     调用线程。

所以,它类似(但更清楚) Sessions and Transactions/Transaction demarcation with plain JDBC

  

换句话说,会话绑定到幕后的线程,但是作用于事务,就像在JTA环境中一样。