org.neo4j.ogm.exception.TransactionManagerException:"此线程的交易不是最新的"何时在原型范围

时间:2016-11-14 10:16:44

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

在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。似乎当启动多个Session时(由于prototype作用域),DefaultTransactionManager无法在提交期间找到先前打开的事务的引用。

我发现每次创建会话时都会删除静态ThreadLocal

但同样的项目在SDN 4.0.0和OGM 1.1.4版本上运行良好。因此,作为一种解决方法,我必须使Session thread作用域。任何人都可以澄清对SDN / OGM做出哪些修改可能导致这种情况。或者这是SDN 4.1.X中的预期行为?

2 个答案:

答案 0 :(得分:0)

感谢您的回复。

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

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

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

  1. "session" - 这不能用作应用程序(主要是后端应用程序)不使用Spring-MVC容器
  2. "prototype" - 表示将为每个数据库命中初始化新的会话对象。这适用于SDN 4.0.0和OGM 1.x. 但是升级后的库不再适用了。会话是容器管理的,不会在事务边界之外进一步使用
  3. "thread" - 这需要明确注册范围。但是,会话在整个线程生命周期中仍然存在。 这确实会扩展内存占用量,应该重复清理/刷新以保持数据完整性。
  4. 我还考虑升级到SDN 4.2.X,但是唯一的SNAPSHOT可用,我对此有点怀疑。

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

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

答案 1 :(得分:0)

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

在SDN 4.2 / OGM 2.1之前,配置和交易的完成方式截然不同。用户需要在扩展Session的配置类中的Neo4jConfiguration bean上定义和指定范围。这导致开发人员在其应用程序的使用范围方面存在很多混淆。在这个最新版本中,这已完全废除。您可以在this blog post中查看如何升级。我们也不会支持这种旧的配置机制。

新版本的SDN将在本月底RC1RELEASE 12月12日左右,因此SNAPSHOT的时间不会太长!< / p>

博客文章还讨论了交易如何运作。