我遇到了一个非常奇怪的问题,即我的 Solr 索引无法看到刚刚写入另一个连接上的 MySQL 数据库的更改。
以下是事件链:
- 用户在网站上启动一个操作,导致将一行添加到 MySQL 中的表中。
- 该行是通过
mysql_query()
(无事务)添加的。如果我从同一个连接再次查询数据库,我自然可以看到我刚刚所做的更改。* - 通过 curl 立即向 Solr 实例发送一个调用,告诉它使用数据导入处理程序对其索引进行部分更新。
- Solr 通过单独的 JDBC 连接(相同的凭据和所有内容)连接到 MySQL 数据库,并对自上次更新以来更新的所有记录执行查询。
但是,此时返回给 Solr 的结果不包括最后添加的行,除非我sleep()
在对数据库进行更改之后并且在将消息发送到 Solr 之前立即插入一个调用。
*请注意,如果我此时确实确实查询了数据库,这需要足够的时间才能让 Solr 实际接收到更改。如果我只是sleep(1)
(一秒钟)也会发生同样的情况。
我正在寻找的是一些可靠的解决方案,它可以让我确保 Solr 在发送刷新消息之前会看到更改。然而,根据我发现的所有文档,调用mysql_query()
应该已经是原子的和同步的,并且在数据库更新之前不应将控制权返回给 PHP。因此,似乎没有任何我可以调用的函数来强制执行此操作。
有没有人有任何建议/想法?我正在用头撞这个。