使用spring和hibernate时,会话/事务如何处理?

时间:2010-03-12 20:37:32

标签: java hibernate spring orm

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

  1. 是在页面请求开始时开始的事务,并在最后提交?
  2. 每个请求可以有多个db调用,每个调用都有不同的事务级别吗?例如有些是默认的,有些是未读的?

3 个答案:

答案 0 :(得分:3)

  

是在页面请求开始时开始的事务,并在结束时提交了吗?

在网络应用程序中,使用“Open Session in View”模式打开/关闭Session 通常。 Spring为此提供了OpenSessionInViewFilterOpenSessionInViewInterceptor。两者都通过当前线程使 Hibernate Sessions可用,这将由事务管理器自动检测。它适用于通过HibernateTransactionManagerJtaTransactionManager进行的服务层事务以及非事务性执行(如果配置正确)。

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

  

每个请求可以有多个db调用,每个调用都有不同的事务级别吗?例如有些是默认的,有些是未读的?

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

答案 1 :(得分:1)

它通常使用面向方面编程(AOP)以声明方式配置。您可以定义哪些bean,类,包或方法需要事务,Spring将以类似于EJB的方式提供它。感谢AOP,您可以完全控制交易的确切内容和方式。

在此处详细了解:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative

答案 2 :(得分:1)

你的问题:

  

1 - 是在该处开始的交易   页面请求的开头,和   承诺到底?

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

requestDispatcher-> Controller->服务电话(交易开始和结束)

服务可以调用Daos,Daos将通过Hibernate与Datastore通信。

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

  

2 - 我可以有多个db调用   请求,每个都有不同   交易水平?例如有些人离开了   默认情况下,而其他人则是   读未提交?

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