绑定到线程,作用于事务 - Hibernate

时间:2014-04-20 14:46:27

标签: hibernate transactions

在尝试加强我的交易技巧时,我遇到了Hibernate与普通JDBC的事务划分。解释的一点是Session被绑定到当前线程(因为它不能绑定到Transaction),但它的作用域是事务。

事实上,我在许多文章中遇到过hibernate session与当前线程的关联,它总是困扰着我。

我想知道的是当前会话被“绑定”到当前线程意味着什么?例如,当你说会话是“scoped”与事务时,我知道(当前)会话将被刷新,当事务结束时关闭。那么“绑定”在这里意味着什么呢?在多线程方面它意味着什么?我不想让这个问题无聊,但我想明白这个会话和线程之间的关联。很高兴看到关于这方面的文章或有一些有用的例子。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果我们采用一些事务性Spring代码:

@Transactional // a new session was created here 
public void someTransactionalMethod() {
    ...
}

这意味着spring容器需要创建会话(如果没有会话)。想到这两个问题:

  • 存储刚创建的会话的位置
  • 去哪里查看是否已创建会话,如果是,则检索它?

Spring方面用于确保@Transactional功能的会话需要存储在除应用程序代码之外的其他位置。

这可以存储在任何地方:单例,会话或ThreadLocal变量,有效地将其绑定到执行应用程序代码的线程。

每个线程都是我们可以存储变量的映射,ThreadLocal是一个方便的抽象,允许创建线程范围的变量。

将会话绑定到线程没有技术限制,它只是一个频繁的设计决策:给变量尽可能最窄的范围,避免全局变量等。

对于在servlet容器中运行的应用程序,可以保证对于给定的HTTP请求,在生成响应之前,将使用相同的线程来处理整个请求。

在其他环境中也有相同的保证,因此最常用的事务管理器JpaTransactionManagerHibernateTransactionManager的设计者决定使用Thread作为实体管理器/ hibernate会话所在的位置。存储

使用ThreadLocal变量将会话/实体管理器绑定到线程是确保事务管理代码中不会出现多线程错误的简单方法,它是一种已知的并发编程策略为Thread Confinement