我遇到了Solr 4.6.1的奇怪场景。
我试图多次更新文档。伪代码:
id1 = obtain-the-ID-of-the-document()
lock()
// only one thread is updating document1
doc1 = read-document-from-Solr-with-realtime-GET(id1)
modify-document(doc1)
update-document-in-Solr(doc1)
unlock()
[...]
id1 = obtain-the-ID-of-the-document()
lock()
// only one thread is updating document1
doc1 = read-document-from-Solr-with-realtime-GET(id1)
modify-document(doc1)
update-document-in-Solr(doc1)
unlock()
现在,我还使用了Solr的乐观锁定机制,主要是为了确保我的更新逻辑正常。有时我会得到冲突"冲突"来自Solr,状态代码为409.
看起来更新操作在写入事务日志之前返回,因为RealTimeGetHandler找不到更新的版本(我知道这是因为返回的文档具有相同的版本号)。因此,第二次修改可能是在同一文档上实际执行的,因为两次实时获取查询都返回相同的文档;冲突的原因。
我通过在更新方法中添加一个小延迟(50-100ms)解决了这个问题并重新查询Solr,直到版本号不同为止;此时我假设事务日志已正确更新,因此我可以安全地解锁并返回以处理下一个文档。
添加任何延迟真的很奇怪,是解决这个问题的更好方法吗?或者也许有一些配置告诉Solr只在写完tlog之后才从更新返回?