我怎样才能解决这个Solr / MySQL竞争条件?

时间:2013-05-28 18:09:55

标签: php mysql solr race-condition

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

以下是一系列事件:

  1. 用户在网站上启动一项操作,该操作会将一行添加到MySQL中。
  2. 该行是通过mysql_query()添加的(无交易)。如果我从同一个连接再次查询数据库,我自然可以看到我刚刚做的更改。*
  3. 通过curl立即将调用发送到Solr实例,告诉它使用数据导入处理程序对其索引进行部分更新。
  4. Solr通过单独的JDBC连接(相同的凭据和所有内容)连接到MySQL数据库,并对自上次更新以来更新的所有记录执行查询。
  5. 但是,此时,返回到Solr的结果包括最后添加的行,除非我在更改数据库之后立即插入sleep()调用将消息发送给Solr。

    *请注意,如果此时我实际执行查询数据库,这需要足够的时间让Solr实际获取更改。如果我只是sleep(1)(一秒钟),就会出现同样的情况。

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

    有没有人有任何建议/想法?我正在敲打这个。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我通常不使用数据导入处理程序,并且网站中的更新会触发一种机制(内部或外部),使用适当的Solr Client使用正在使用的编程语言将记录更新为Solr。我个人过去并没有很好的使用数据导入处理程序,因此更倾向于使用自定义代码将Solr与相应的数据存储平台同步。