当使用带有spring的hibernate时,有人可以解释会话单元的工作和事务是如何处理的吗?
答案 0 :(得分:3)
是在页面请求开始时开始的事务,并在结束时提交了吗?
在网络应用程序中,使用“Open Session in View”模式打开/关闭Session
通常。 Spring为此提供了OpenSessionInViewFilter
或OpenSessionInViewInterceptor
。两者都通过当前线程使 Hibernate Sessions
可用,这将由事务管理器自动检测。它适用于通过HibernateTransactionManager
或JtaTransactionManager
进行的服务层事务以及非事务性执行(如果配置正确)。
事务划分通常在服务方法级别完成,使用Spring AOP将它们包装在事务中。
每个请求可以有多个db调用,每个调用都有不同的事务级别吗?例如有些是默认的,有些是未读的?
您可以使用具有不同隔离级别的嵌套事务。请参阅Transaction Management章节。
答案 1 :(得分:1)
它通常使用面向方面编程(AOP)以声明方式配置。您可以定义哪些bean,类,包或方法需要事务,Spring将以类似于EJB的方式提供它。感谢AOP,您可以完全控制交易的确切内容和方式。
答案 2 :(得分:1)
你的问题:
1 - 是在该处开始的交易 页面请求的开头,和 承诺到底?
不完全是。 spring MVC的常用工作流程是:
requestDispatcher-> Controller->服务电话(交易开始和结束)
服务可以调用Daos,Daos将通过Hibernate与Datastore通信。
事务可以在http响应之后继续生效。例如服务在一个线程中运行。
2 - 我可以有多个db调用 请求,每个都有不同 交易水平?例如有些人离开了 默认情况下,而其他人则是 读未提交?
是的,你当然可以。 比方说,您的应用程序执行迁移工作。请求说“开始迁移!”然后,您的服务将通过源数据库读取数据,并根据您的迁移逻辑做一些神奇的基础,最后写入目标数据库,然后提交事务。