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