了解交易的运作方式

时间:2017-08-07 11:29:50

标签: hibernate spring-transactions

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

1 个答案:

答案 0 :(得分:0)

简短的回答是:这取决于您的读取操作的执行方式。

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

2个警告:

  1. 我假设我们在执行写入然后阅读(在Spring @Transactional方法中使用默认传播级别)时处于事务边界内
  2. 不确定你的getPersonByName(" bob")如何在其下工作(Spring-Data?或JPQL / HQL?或Criteria?或find()等)。
  3. 在Hibernate中,默认情况下会激活第一级缓存。它链接到Hibernate Session ,并且由它获取的所有实体都存储在Session中。 因此,写入后的后续读取不应该在同一个Session 中往返于DB。

    现在,默认情况下不使用Hibernate的第一级缓存,除非您使用:

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