Apache Ignite c++ 客户端 2.16。交易 - IGNITE_ERR_TX_THIS_THREAD 问题

问题描述 投票:0回答:1

我的应用程序是多线程的,并且我有多个应用程序实例正在运行,这会使用事务在同一缓存上针对不同的键集触发 getAll 。

Apache Ignite 抛出“当前线程 IGNITE_ERR_TX_THIS_THREAD = 2027 已启动事务”。错误。

我的应用程序执行以下操作。

  1. 插入消息
  2. 检查它是否收到所有消息(因为其他实例也在插入)检查 ContainsKey(KeySets)
  3. 如果是,则创建一个事务,获取所有消息 (getAll) 并将其存储在应用程序数据结构中以供进一步处理,然后从缓存中删除所有消息并提交事务。这是必需的,因为只有 1 个应用程序实例应该获取所有消息。否则,它会得到重复项。如果有任何交易错误,还有重试机制。

由于步骤 3 对于同一缓存上的不同键集频繁发生,因此我认为 Ignite 会抛出 IGNITE_ERR_TX_THIS_THREAD 错误。有更好的方法来处理这个错误吗?

我尝试增加 StripedPoolSize 但仍然遇到相同的错误。

ignite apacheignite
1个回答
0
投票

哇!这里有很多事情要讨论。 1.) 每当我听说在缓存中插入然后删除条目时,我都会立即开始担心内存增长和压缩问题等问题。除了插入/删除之外,还有其他方法可以解决这个问题吗? 2.)您声明您是多线程的,其中不同的线程处理不同的消息(键)。这些不同的消息(密钥)是否位于不同的分区中?如果不是,您的架构可能会因同一分区上的事务争用而导致固有锁定或延迟? 3.)最后,您对第三项的描述根本不清楚。您启动一个事务,获取全部,更新一些内容,然后删除所有内容?抱歉,但我无法就此提供任何建议,因为“全部”的多次使用根本无法辨别正在获取的内容、更新的内容、删除的内容。可能有帮助的一件事(我不能肯定地说)是考虑使用不同的缓存?一个缓存用于确定您是否拥有正确的密钥。然后是第二个缓存来存储正确键的最终结果。这可能会减少事务争用,因为您知道确切的密钥和确切的数据,所以第二个缓存的最终状态的 TX 应该很快。希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.