繁体   English   中英

Hibernate JTA多用户会话事务映射

[英]Hibernate JTA multiuser session-transaction mapping

我指的是https://developer.jboss.org/wiki/SessionsAndTransactions ,目前正在尝试了解JTA的划分。 它指出在特定事务中,使用getCurrentSession()总是给出相同的当前会话。 它的意思是:

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

任何指针/帮助深表感谢。

谢谢

根据javadoc SessionFactory.getCurrentSession()

“当前”的确切定义由配置为使用的{@link org.hibernate.context.spi.CurrentSessionContext} impl控制。

已配置JTA,这将默认为{@link org.hibernate.context.internal.JTASessionContext}的实现。

然后您可以看到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

在内部,事务管理器将事务与线程相关联,并且此处的方法对与调用线程相关联的事务进行操作。

因此,它与普通JDBC的会话和事务/事务划分类似(但更清楚):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM