Php 如何解决这个Solr/MySQL争用条件?

Php 如何解决这个Solr/MySQL争用条件?,php,mysql,solr,race-condition,Php,Mysql,Solr,Race Condition,我遇到了一个非常奇怪的问题,我的Solr索引无法看到在另一个连接上刚刚写入MySQL数据库的更改 以下是事件链: 用户在网站上发起一个操作,将一行添加到MySQL中的表中 该行是通过mysql\u query()添加的(无事务)。如果我从同一个连接再次查询数据库,我自然可以看到我刚才所做的更改* 通过curl立即向Solr实例发送一个调用,告诉它使用数据导入处理程序对其索引进行部分更新 Solr通过单独的JDBC连接(相同的凭证和所有内容)连接到MySQL数据库,并对自上次更新以来更新的所有记录

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

以下是事件链:

  • 用户在网站上发起一个操作,将一行添加到MySQL中的表中
  • 该行是通过
    mysql\u query()
    添加的(无事务)。如果我从同一个连接再次查询数据库,我自然可以看到我刚才所做的更改*
  • 通过curl立即向Solr实例发送一个调用,告诉它使用数据导入处理程序对其索引进行部分更新
  • Solr通过单独的JDBC连接(相同的凭证和所有内容)连接到MySQL数据库,并对自上次更新以来更新的所有记录执行查询
  • 但是,此时返回到Solr的结果不包括最后添加的行,除非我在对数据库进行更改之后并在将消息发送到Solr之前立即插入
    sleep()
    调用

    *请注意,如果我在此时确实查询数据库,这需要足够的时间让Solr实际获取更改。如果我只是
    睡眠(1)
    (一秒钟),也会发生同样的情况

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


    有人有什么建议/想法吗?我的头撞到了这一条。

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

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

    @@AUTOCOMMIT
    为1,但第二个连接仍无法获取更改。在单独的命令行类型MySQL窗口中,在您认为新记录已插入/提交后,运行查询进行验证。如果行不存在或未更新,则这是一个基本的提交或事务隔离设置问题。如果它在那里,而Solr没有看到它,则Solr查询中可能存在读取某些(旧)缓存值的问题。根据前面的评论,可能是这样的,因为经过一段时间后,它似乎被拾取(反映缓存超时情况)。很有趣。我基本上是在别人设计之后才开始的。我猜使用DIH是她的主意,我并不真正了解其他选择。我肯定会调查的,但目前我只需要让它工作起来。:)