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

绑定到线程,作用域为事务-Hibernate,hibernate,transactions,Hibernate,Transactions,在尝试加强事务处理技能时,我遇到了Hibernate与普通JDBC之间的事务划分。解释的要点之一是会话绑定到当前线程(因为它不能绑定到事务),但它的作用域是事务 事实上,我在许多文章中都遇到了hibernate会话与当前线程的关联,这总是让我感到困扰 我想知道的是,当前会话“绑定”到当前线程意味着什么?例如,当您说会话与事务“范围化”时,我理解(当前)会话将在事务结束时被刷新、关闭。那么“绑定”在这里是什么意思呢?它在多线程方面意味着什么?我不想让问题变得无聊,但我想清楚地理解会话和线程之间的联

在尝试加强事务处理技能时,我遇到了Hibernate与普通JDBC之间的事务划分。解释的要点之一是会话绑定到当前线程(因为它不能绑定到事务),但它的作用域是事务

事实上,我在许多文章中都遇到了hibernate会话与当前线程的关联,这总是让我感到困扰

我想知道的是,当前会话“绑定”到当前线程意味着什么?例如,当您说会话与事务“范围化”时,我理解(当前)会话将在事务结束时被刷新、关闭。那么“绑定”在这里是什么意思呢?它在多线程方面意味着什么?我不想让问题变得无聊,但我想清楚地理解会话和线程之间的联系。我很乐意读一篇关于这方面的文章,或者有一些有用的例子


提前感谢。

如果我们以一些事务性Spring代码为例:

@Transactional // a new session was created here 
public void someTransactionalMethod() {
    ...
}
这意味着,如果没有会话,spring容器需要创建会话。想到这两个问题:

  • 在何处存储刚刚创建的会话
  • 去哪里查看会话是否已创建,如果已创建,则检索会话
Spring方面用于确保
@事务性
功能的会话需要存储在应用程序代码以外的地方

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

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

将会话绑定到线程没有技术约束,它只是一个频繁的设计决策:为变量提供尽可能窄的范围,避免全局变量,等等

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

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


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

我可能有后续疑问,但这清楚地回答了我的主要问题。谢谢