使用 spring 和 hibernate 时,如何处理会话/事务?

Posted

技术标签:

【中文标题】使用 spring 和 hibernate 时,如何处理会话/事务?【英文标题】:When using spring and hibernate, how are sessions/transactions handled? 【发布时间】:2010-03-12 20:37:32 【问题描述】:

当使用带有 spring 的 hibernate 时,有人可以解释会话工作单元和事务是如何处理的吗?

    事务是否在页面请求开始时开始,并在结束时提交? 每个请求可以有多个数据库调用,每个调用都有不同的事务级别吗?例如有些保留为默认值,而另一些则未提交?

【问题讨论】:

与 Spring 一样,您可以随心所欲地进行操作,它并不决定您的技术。因此,对于您问题中的所有内容,答案都是“是”。一个更具体的“我如何让它做 X”将是一个更有用的问题。 skaffman 的评论是迄今为止该主题中的最佳答案 【参考方案1】:

事务是否在页面请求开始时开始,并在结束时提交?

在 Web 应用程序中,通常使用“Open Session in View”模式打开/关闭Session。 Spring为此提供了OpenSessionInViewFilterOpenSessionInViewInterceptor。两者都使 Hibernate Sessions 通过当前线程可用,事务管理器将自动检测到该线程。它适用于通过HibernateTransactionManagerJtaTransactionManager 进行的服务层事务以及非事务性执行(如果配置适当)。

事务划分通常在服务方法级别完成,使用 Spring AOP 将它们包装在事务中。

每个请求可以有多个数据库调用,每个调用都有不同的事务级别吗?例如有些保留为默认值,而另一些则未提交?

您可以拥有具有不同隔离级别的嵌套事务。请参阅Transaction Management 章节。

【讨论】:

感谢您的贡献!实际上,每次我需要一些特别的东西时,我都会看到你的 cmets。实际上,我正在寻找跨两个事务(例如两个 @Transactional 方法)扩展 Hibernate 会话生命周期以保留 L1 缓存的方法,并且我没有考虑过您帖子中提到的将会话绑定到 HTTP 请求的助手.例如,如果我想为SimpleJaxWsServiceExporter 公开的 JAX-WS WebService 实现相同的功能(当请求/响应流不是由 Spring 管理时),您有什么建议?【参考方案2】:

它通常使用面向方面编程 (AOP) 以声明方式配置。您可以定义哪些 bean、类、包或方法需要事务,Spring 将以类似于 EJB 的方式提供它。多亏了 AOP,您可以完全控制交易的具体内容和方式。

在此处了解更多信息:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative

【讨论】:

【参考方案3】:

回答您的问题:

1-是交易开始于 页面请求的开头,以及 最后提交了吗?

不完全是。 Spring MVC通常的工作流程是:

requestDispatcher->Controller->服务调用(事务在这里开始和结束)

服务可能会调用 Daos,Daos 将通过 Hibernate 与 Datastore 对话。

在 http 响应之后,事务可以继续存在。例如服务在线程中运行。

2-我可以有多个数据库调用吗 要求,每个人都有不同的 交易水平?例如剩下一些 默认情况下,而其他人是 读未提交?

当然可以。 假设您的应用程序执行迁移工作。请求说“开始迁移!”然后您的服务将通过源数据库读取数据,并根据您的迁移逻辑做一些魔术,最后写入目标数据库,并提交事务。

【讨论】:

以上是关于使用 spring 和 hibernate 时,如何处理会话/事务?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 如何处理 Hibernate 会话?

Hibernate + Spring 使用多个数据源?

在Spring和Hibernate中使用TransactionProxyFactoryBean

spring/hibernate 如何为我们提供防止 SQL 注入的保证以及它是如何在内部处理的?

在 Hibernate 和 Spring 之间集成时如何插入日期类型

为啥 Spring 在使用 Hibernate 3 时推迟关闭 Hibernate 会话