使用 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为此提供了OpenSessionInViewFilter
或OpenSessionInViewInterceptor
。两者都使 Hibernate Sessions
通过当前线程可用,事务管理器将自动检测到该线程。它适用于通过HibernateTransactionManager
或JtaTransactionManager
进行的服务层事务以及非事务性执行(如果配置适当)。
事务划分通常在服务方法级别完成,使用 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 会话?
在Spring和Hibernate中使用TransactionProxyFactoryBean
spring/hibernate 如何为我们提供防止 SQL 注入的保证以及它是如何在内部处理的?