我在我的应用程序中有几个竞争条件,我能够" SELECT"以前由另一个线程删除的文档1-2秒前。我将ScanConsistency.REQUEST_PLUS添加到我的" SELECTs"但这需要太长时间......
我计划将PersistTo.ONE参数添加到" DELETE"但是,我不确定后续的" SELECT"仍然会看到被删除的文件,因为我认为它可能会调用" SELECT"在其中一个非主节点上仍然有内存中已删除的文件。
是否可以" SELECT"仅在主节点上?
我可以使用PersistTo.FOUR,但我认为这也会大大影响性能。
答案 0 :(得分:0)
从我从阅读有关此功能的文档(这是Couchbase的最新添加内容)中可以看出,编辑在另一个线程上发生的事实非常重要。每个线程都必须拥有自己的数据库会话,理论上可以从该线程中提取一致性级别 ,但是您需要让该线程与您的线程进行通信(可能是非首发)。
因此,回到基础,重要的是要意识到数据库本身是最终一致的数据存储。这意味着,在CAP-theorem的情况下,数据存储会为可用性和分区容差牺牲一致性。在所有情况下都是如此,但N1QL机制试图对“你自己的写入”进行一点补偿。作为一名软件架构师,我不会依赖于此,除非我需要它作为临时解决方案,而是在设计应用程序数据存储时牢记主流的设计原则。
底线是我相信这种行为是预期的,你的设计应该容忍它。如果您的应用程序要求跨会话立即保持一致,那么您应该使用不同的数据存储。