【问题标题】:org.neo4j.ogm.exception.TransactionManagerException: "Transaction is not current for this thread" when the session is used in prototype scopeorg.neo4j.ogm.exception.TransactionManagerException:当会话在原型范围内使用时,“该线程的事务不是当前的”
【发布时间】:2016-11-14 10:16:43
【问题描述】:

在 SDN 4.1.X 中使用 prototype 范围内的 Session 和 @Transactional 注释时,我看到以下异常:

org.neo4j.ogm.exception.TransactionManagerException: "Transaction is not current for this thread"

我最近将我的 Spring Boot 项目升级到 SDN 4.1.X 和 Neo4j OGM 2.0.3。似乎当启动多个Sessions 时(由于prototype 作用域)DefaultTransactionManager 在提交期间无法找到先前打开的事务的引用。

我看到每次创建会话时都会删除静态 ThreadLocal。

但同一个项目在 SDN 4.0.0 和 OGM 1.1.4 版本上运行良好。因此,作为一项工作,我不得不将Session thread 限定为范围。任何人都可以澄清对 SDN/OGM 进行的哪些修改可能导致此问题。或者这是 SDN 4.1.X 中的预期行为?

【问题讨论】:

  • 您正在从 OGM 1.x 升级到 2.x。其中有很多重大变化。 OGM 2.0.x 允许使用thread 范围会话,但我的建议是不要使用它。您想要实现什么需要在应用程序的生命周期内将所有数据库对象保留在内存中?如果您正在升级,我强烈建议您迁移到 SDN 4.2/OGM 2.1,因为这些版本中的重大变化比 4.1/2.0 还要多。
  • 我已在答案部分提供了更多信息。请让我知道您对此的看法。

标签: neo4j spring-data-neo4j spring-data-neo4j-4 neo4j-ogm


【解决方案1】:

感谢您的回复。

让我澄清一下应用程序范围。 我的应用程序本质上是异步/并发和非阻塞的,由 Reactor 提供支持。

并发由基于 Pool based Grouping 的 Reactor-Stream API 控制。 这意味着数据通过并发线程(workers)存储在 Neo4J 中 基于某些特定于应用程序的分组上下文创建的多个组(线程池)。 在一个组内,与 Neo4J 的交互始终是连续的。

因此,以下是我为 Neo4J 会话考虑的选项,(我在配置中使用了@EnableTransactionManagement,在与 Neo4J 交互的方法中使用了@Transactional)

  1. "session" - 这不能用作应用程序(主要是后端应用程序)不使用 Spring-MVC 容器
  2. "prototype" - 意味着将为每个数据库命中初始化新的会话对象。这适用于 SDN 4.0.0 和 OGM 1.x。 但是使用升级的库它不再工作了。会话由容器管理,不会在事务边界之外进一步使用
  3. "thread" - 这需要显式注册范围。但是,会话在整个线程生命周期中仍然存在。 这确实会扩展内存占用,并且应该反复清理/刷新以保持数据完整性。

我也想过升级到 SDN 4.2.X,但只有 SNAPSHOT 可用,我有点怀疑是否继续。

另外,我看到当事务方面(@EnableTransactionManagement) 被删除时,它工作正常。但我想知道它是否正确处理交易。

对 Neo4J OGM 的事务管理感到困惑,其中会话无法在 Singleton 或 Session 范围内初始化?或者解决这种情况的首选工作是什么?

【讨论】:

  • 你应该把它移到问题本身,因为它不是答案。
  • 正如我在回答中提到的,您永远不必为它定义 Session @Bean 或相关范围。您需要做的就是在任何 Spring 管理的 @Component 或 @Service 等中定义 @Autowired Session session(只需确保在与会话交互时使用 @Transactional 或 TransactionTemplate 以利用 Spring 的事务管理) .但是,当您这样做时,重要的是要注意注入的Session bean 实际上是代理的。如果它已经存在于事务的上下文中,则它使用相同的 bean。
【解决方案2】:

好的,我想我理解这些问题。

在 SDN 4.2 / OGM 2.1 之前,配置和事务的完成方式非常不同。用户需要在扩展Neo4jConfiguration 的配置类中定义和指定Session bean 的范围。这导致开发人员在应用程序使用哪个范围方面产生了很多混淆。在这个最新版本中,这已被完全取消。您可以在this blog post 中查看如何升级。我们也不会继续支持这种旧的配置机制。

SDN 的新版本将在本月底之前为RC1,在 12 月 12 日左右为RELEASE,因此SNAPSHOT 的时间不会太长!

这篇博文还讨论了事务的工作原理。

【讨论】:

  • 好的。一旦 GA 可用,我宁愿计划进行另一轮迁移。直到我不得不使用 SDN 4.1.3.RELEASE 和 OGM 2.0.5。那么您对在每个工作单元之前使用带有 session.clear() 的“线程”范围有何看法。 (@Transional 中的代码)?这是我目前看到的唯一可用的解决方法。
猜你喜欢
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2017-01-18
  • 2014-12-21
  • 2015-02-04
相关资源
最近更新 更多