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

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

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

【问题讨论】:

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

标签: java hibernate spring orm


【解决方案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-我可以有多个数据库调用吗 要求,每个人都有不同的 交易水平?例如剩下一些 默认情况下,而其他人是 读未提交?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多