我对数据库事务的概念有一个大致的了解。我们在事务中访问数据库以确保 ACID 属性。
在 Hibernate 中有一个称为会话的概念。会话有什么用?何时应该在两个会话中而不是在同一个会话中进行数据库访问?
为了解释更多,我看到了休眠代码
- 从会话工厂获取会话
- 打开一个会话
- 开始交易
- 提交事务
- 关闭会话
我需要知道的是这里会话的重要性是什么?为什么没有像事务工厂这样的东西,开始事务和提交事务呢?
我对数据库事务的概念有一个大致的了解。我们在事务中访问数据库以确保 ACID 属性。
在 Hibernate 中有一个称为会话的概念。会话有什么用?何时应该在两个会话中而不是在同一个会话中进行数据库访问?
为了解释更多,我看到了休眠代码
我需要知道的是这里会话的重要性是什么?为什么没有像事务工厂这样的东西,开始事务和提交事务呢?
Session 不仅仅是一个事务,它是UnitOfWork模式的一个实现。换句话说,它保留加载的对象,知道哪些对象必须被持久化等:
工作单元跟踪您在可能影响数据库的业务事务期间所做的一切。完成后,它会计算出根据您的工作更改数据库需要做的所有事情。
为了更好地理解 Session 和 Transaction 之间的关系,你可以看看这篇文章。
单个 Hibernate Session 可能与单个数据库事务具有相同的范围。
这是用于每请求会话实现模式的最常见的编程模型。单个 Session 和单个数据库事务实现对特定请求事件的处理(例如,Web 应用程序中的 Http 请求)。永远不要使用 session-per-operation 反模式!(当每个操作会话可能是合适的时候,有极少数的例外,如果你只是学习 Hibernate,你不会遇到这些。)
另一种编程模型是长对话,例如实现多步骤对话的应用程序,例如向导对话,以在多个请求/响应周期中与用户交互。实现这一点的一种方法是 session-per-request-with-detached-objects 模式。一旦持久对象在用户思考期间被认为是分离的,并且在它们被修改后必须重新附加到新的会话。
但是,建议使用每会话会话模式。在这种情况下,单个 Session 比单个数据库事务具有更大的范围,它可能跨越多个数据库事务。每个请求事件都在单个数据库事务中处理,但 Session 的刷新将延迟到会话结束和最后一个数据库事务,以使会话具有原子性。在用户思考期间,会话保持断开状态,没有打开的数据库连接。Hibernate 的自动乐观并发控制(带有版本控制)用于提供对话隔离。
@Dmitry 回答得很好。
查看会话的另一种方法是作为Instance of Database Usage。当你创建一个会话时,你有一个上下文准备好与其中所需的支持服务(例如事务、缓存、连接等)进行任何数据库交互。事务是会话中使用的独立服务。
此外,会话是典型的 OR 映射工具(如 hibernate)使用的一级缓存。会话充当根据请求创建的临时上下文以促进数据库交互。