【问题标题】:How can I solve this Solr/MySQL race condition?如何解决这个 Solr/MySQL 竞争条件?
【发布时间】:2013-05-28 18:09:54
【问题描述】:

我遇到了一个非常奇怪的问题,我的 Solr 索引无法看到刚刚写入另一个连接上的 MySQL 数据库的更改。

这是事件链:

  1. 用户在网站上启动了一个操作,该操作导致将一行添加到 MySQL 中的表中。
  2. 通过mysql_query() 添加行(无事务)。如果我从同一个连接再次查询数据库,我自然可以看到我刚刚所做的更改。*
  3. 立即通过 curl 向 Solr 实例发送一个调用,告诉它使用数据导入处理程序对其索引进行部分更新。
  4. Solr 通过单独的 JDBC 连接(相同的凭据和所有内容)连接到 MySQL 数据库,并对自上次更新以来更新的所有记录执行查询。

然而,此时返回到 Solr 的结果包括最后添加的行,除非我在对数据库进行更改之后和发送之前立即插入 sleep() 调用给 Solr 的消息。

*请注意,如果我此时确实确实查询了数据库,这需要足够的时间才能让 Solr 实际接收到更改。如果我只是 sleep(1)(一秒钟),也会发生同样的情况。

我正在寻找的是一些可靠的解决方案,它可以让我确保 Solr 在发送刷新消息之前能够看到更改。但是,根据我找到的所有文档,对mysql_query() 的调用应该已经是原子的和同步的,并且在数据库更新之前不应将控制权返回给 PHP。因此,我似乎无法调用任何函数来强制执行此操作。

有人有什么建议/想法吗?我正在努力解决这个问题。

【问题讨论】:

    标签: php mysql solr race-condition


    【解决方案1】:

    检查插入记录时自动提交设置的内容。刚插入的记录很可能在同一个数据库会话中,因此可以看到(但未提交)。在此之后,某些事件会导致提交发生,因此另一个线程/会话可以“看到”记录。还要检查事务隔离级别设置。

    【讨论】:

    • @@AUTOCOMMIT 为 1,但第二个连接仍未接收到更改。
    • 在单独的命令行类型 MySQL 窗口中,在您认为新记录已插入/提交后,运行查询进行验证。如果该行不存在或未更新,则这是基本提交或事务隔离设置问题。如果它在那里,然后 Solr 看不到它,则可能是 Solr 查询中的一个问题,它可能正在读取一些(旧)缓存值。根据之前的评论,这可能是这种情况,因为一段时间后它似乎被拾取(反映缓存超时情况)。
    【解决方案2】:

    我通常不使用数据导入处理程序,并且会让网站中的更新触发一种机制(内部或外部),以使用所用编程语言的适当 Solr Client 将记录更新到 Solr。我个人过去对数据导入处理程序不太满意,因此更喜欢使用自定义代码将 Solr 与相应的数据存储平台同步。

    【讨论】:

    • 有趣。我基本上是在别人设计之后才进入这个领域的。我想使用 DIH 是她的想法,我并不真正了解替代方案。我肯定会调查的,但目前我只需要让它工作。 :)
    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 2013-10-11
    • 2019-08-20
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多