2017-08-07 61 views
0

我正在使用Spring并使用hibernate和JPA。当我为我的方法提供一个事务上下文时,我想知道它是如何工作的。例如,我有一些实体类人员。我创建了一个人bob并坚持实体。如果我致电getPersonByName("bob"),它会在交易结束前返回bob吗?了解事务如何工作

+0

如果您的意思是说持久性(保存)和检索(getPersonByName)是同一方法的一部分,那么它将不会返回,因为当方法执行完成并且线程存在方法时持久化对象。 如果持久性和检索在具有不同事务边界的两种方法中分离出来,那么它将起作用。 –

回答

0

简短的回答是:它取决于您的读取操作是如何实施的。

您可以打开日志记录并设置一个测试工具查看自己。您可以关注these instructions to enable SQL queries and parameters printing

2注意事项:

  1. 我假设我们是事务性的范围内,当我们执行写入,然后阅读(春季@Transactional方法(S)与默认传播级)
  2. 不知道如何你的getPersonByName(“bob”)在Spring-Data?或JPQL/HQL?或Criteria?或find()等)下工作。

休眠中一级缓存默认为激活状态。它与休眠会话相关联,并且由其获取的所有实体都存储在会话中。 因此,写入后的后续读取不应在同一会话内往返于数据块。

现在Hibernate的1级高速缓存不使用默认情况下,除非你使用:

  • 的EntityManager#查找()为后续操作
  • 通过getter方法随后访问关系从上面EntityManager#find()获取的实体
  • 它不用于任何类型的查询