在spring中使用hibernate时,有人可以解释会话单元的工作和事务是如何处理的?使用spring和hibernate时,会话/事务如何处理?
- 是在页面请求开始时开始的事务,并在最后提交?
- 我可以有多个数据库调用每个请求,每个都有不同的事务级别?例如有些保留为默认值,而另一些则是未读取的?
在spring中使用hibernate时,有人可以解释会话单元的工作和事务是如何处理的?使用spring和hibernate时,会话/事务如何处理?
是在页面请求开始时开始的事务,并在最后提交?
在web应用中,打开/关闭Session
是通常使用 “Open Session in View” 图案完成。春天为此配备了OpenSessionInViewFilter
或OpenSessionInViewInterceptor
。两者都通过当前线程提供Hibernate Sessions
,这些线程将由事务管理器自动检测。它适用于通过HibernateTransactionManager
或JtaTransactionManager
以及非事务性执行(如果适当配置)的服务层事务。
事务划分通常在服务方法级别完成,使用Spring AOP将它们包装在事务中。
我可以有多个数据库调用每个请求,每个都有不同的事务级别?例如有些保留为默认值,而另一些则是未读取的?
您可以使用不同隔离级别的嵌套事务。请参阅Transaction Management一章。
感谢您的贡献!其实,每次我需要一些特别的东西时,我都会看到你的评论。实际上,我正在寻找扩展两个事务间Hibernate会话生命周期的方法(例如两个'@ Transactional'方法)来保存L1缓存,而且我还没有想过你的文章中提到的绑定会话到HTTP的助手请求。例如,如果我想为'SimpleJaxWsServiceExporter'公开的JAX-WS WebService实现相同的功能(当请求/响应流不由Spring管理时),你能建议什么? – 2010-10-07 16:24:18
它通常使用面向方面编程(AOP)声明式配置。您可以定义哪些bean,类,包或方法需要事务,Spring将以类似于EJB的方式提供它。得益于AOP,您可以完全控制事务包含的内容和方式。
您的问题:
1 - 是该交易在 开始页面请求的启动,以及 致力于在结束了吗?
不完全是。 Spring MVC中的常用的工作流程是:
requestDispatcher->控制器 - >服务电话(交易开始,在这里结束)
服务可以调用的DAO,DAO将通过Hibernate的交谈数据存储。
交易可以继续生活在http响应之后。例如服务在一个线程中运行。
2,可我每次 要求多个数据库调用,每个有不同的 交易水平?例如有些是 作为默认值,而另一些是 未读取?
是的,你当然可以。假设您的应用程序执行迁移作业。一个请求说“开始迁移!”然后你的服务将通过源数据库读取数据,并在你的迁移逻辑上做一些神奇的基础,最后写入目标数据库并提交事务。
和往常一样,你可以以任何你想要的方式做到这一点,它并不决定你的技术。所以你的问题的答案是“是”。更具体的“如何让它做X”将是一个更有用的问题。 – skaffman 2010-03-12 21:35:40
skaffman的评论是迄今为止最好的答案 – 2010-03-13 12:44:30