2010-03-12 127 views
2

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

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

和往常一样,你可以以任何你想要的方式做到这一点,它并不决定你的技术。所以你的问题的答案是“是”。更具体的“如何让它做X”将是一个更有用的问题。 – skaffman 2010-03-12 21:35:40

+0

skaffman的评论是迄今为止最好的答案 – 2010-03-13 12:44:30

回答

3

是在页面请求开始时开始的事务,并在最后提交?

在web应用中,打开/关闭Session通常使用 “Open Session in View” 图案完成。春天为此配备了OpenSessionInViewFilterOpenSessionInViewInterceptor。两者都通过当前线程提供Hibernate Sessions,这些线程将由事务管理器自动检测。它适用于通过HibernateTransactionManagerJtaTransactionManager以及非事务性执行(如果适当配置)的服务层事务。

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

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

您可以使用不同隔离级别的嵌套事务。请参阅Transaction Management一章。

+0

感谢您的贡献!其实,每次我需要一些特别的东西时,我都会看到你的评论。实际上,我正在寻找扩展两个事务间Hibernate会话生命周期的方法(例如两个'@ Transactional'方法)来保存L1缓存,而且我还没有想过你的文章中提到的绑定会话到HTTP的助手请求。例如,如果我想为'SimpleJaxWsServiceExporter'公开的JAX-WS WebService实现相同的功能(当请求/响应流不由Spring管理时),你能建议什么? – 2010-10-07 16:24:18

1

您的问题:

1 - 是该交易在 开始页面请求的启动,以及 致力于在结束了吗?

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

requestDispatcher->控制器 - >服务电话(交易开始,在这里结束)

服务可以调用的DAO,DAO将通过Hibernate的交谈数据存储。

交易可以继续生活在http响应之后。例如服务在一个线程中运行。

2,可我每次 要求多个数据库调用,每个有不同的 交易水平?例如有些是 作为默认值,而另一些是 未读取?

是的,你当然可以。假设您的应用程序执行迁移作业。一个请求说“开始迁移!”然后你的服务将通过源数据库读取数据,并在你的迁移逻辑上做一些神奇的基础,最后写入目标数据库并提交事务。

相关问题