【发布时间】:2018-09-26 00:06:04
【问题描述】:
我在具有 RESOURCE_LOCAL 事务类型的独立应用程序中使用两个 EntityManager 实例。我执行这样的操作:
- 使用第一个 EntityManager (em1) 保存实体
- 使用第二个 EntityManager (em2) 更新实体
- 使用第一个 EntityManager (em1) 读取实体
问题是第三步的 em1 没有看到 em2 完成的更新。
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
// Step 1: create entity
EntityManager em1 = emf.createEntityManager();
em1.getTransaction().begin();
Article article = new Article("article_1");
em1.persist(article);
em1.getTransaction().commit();
// Step 2: update entity
EntityManager em2 = emf.createEntityManager();
em2.getTransaction().begin();
Article articleForUpdate = em2.find(Article.class, 1L);
articleForUpdate.setName("updated article_1");
em2.persist(articleForUpdate);
em2.getTransaction().commit();
// Step 3: read updated entity
em1.getTransaction().begin();
Article updatedArticle = em1.find(Article.class, 1L);
em1.getTransaction().commit();
log.info("updated entity: {}", updatedArticle); // logs stale data
em1.close();
em2.close();
emf.close();
谁能解释一下为什么 em1 会读取过期数据?
【问题讨论】:
-
可能会出现很多原因...您尝试
flush()或evict()cahce 吗?所描述的行为通常是已知且正确的。