我遇到一个非常奇怪的问题,我的Solr索引无法看到刚刚写入另一个连接上的MySQL数据库的更改。我该如何解决Solr/MySQL竞争条件?
下面是一连串事件:
- 用户启动,导致在MySQL被添加到一个表中的行网站上的动作。
- 该行通过
mysql_query()
(无交易)添加。如果我再次从同一连接查询数据库,我可以自然地看到我刚刚做出的更改。* - 调用立即通过curl发送到Solr实例,告诉它使用数据导入对其索引进行部分更新处理程序。
- Solr通过单独的JDBC连接(相同凭证和所有内容)连接到MySQL数据库,并对自上次更新以来更新的所有记录执行查询。
在这一点上,然而,结果返回到Solr做不包括最后添加的行,除非我作出改变到数据库后发送邮件到Solr之前立即插入一个sleep()
电话。
*请注意,如果我真的做在这一点上查询数据库,但是这需要足够的时间来实现由Solr实际获得的更改。如果我只是sleep(1)
(一秒钟),也会发生同样的情况。
我在寻找的是一些可靠的解决方案,可以让我确保在发送刷新消息之前,Solr会看到更改。根据我发现的所有文档,对mysql_query()
的调用应该已经是原子和同步的,并且在数据库更新之前不应该将控制权返回给PHP。因此,我似乎没有任何功能可以强制执行。
有没有人有任何建议/想法?我正在嘲笑这个。
'@@ AUTOCOMMIT'为1,但更改仍未被第二个连接拾取。 – devios1
在一个单独的命令行中键入MySQL窗口,在您认为插入/提交了新记录后,运行查询进行验证。如果该行不存在或未更新,那么这是一个基本的提交或事务隔离设置问题。如果它在那里,然后Solr没有看到它,这是Solr查询中可能读取一些(旧)缓存值的问题。根据之前的评论,可能会出现这种情况,因为在一段时间之后它似乎被拾起(反映缓存超时情况)。 –