作者回复: 很有洞察力的一个问题。 一个读线程,使用 readConcern:majority,在t1 的时候读S1节点,S1是否要返回最新的一个写入 x=1 还是要等到t5? 首先理解,这个读线程只能读 一个被大多数节点确认的写入(满足write majority),这才可以满足readConcern: majority的条件。 在t1的时候,x=1实际上已经到达两个节点(majority),但是判断这个事实的是主节点。在主节点没有知道并确认x=1这个操作已经被多数节点写入的时候,这条数据是不够资格被发给 readConcern: majority 读线程的。 这个是3个节点,想象一下5个节点 - 那S1是肯定不知道数据已经写入到多数节点,只能等primary 告诉他。 这里是官方的文档: https://docs.mongodb.com/manual/reference/read-concern-majority/
作者回复: 如果你的writeConcern是默认,比如说你写 x:1 到主节点, ,它会立即返回。如果你马上再去用majority readConcern去读这条数据,这条数据有可能没被复制到多数节点,你就读不到它。如果在同一个线程内,一般这个是不可以接受的。 正解是,在读写操作是同一个应用发起时,你要配合使用 writeConcern:majority 来保证你的写已经被提交到大多数节点,这样你马上再用readConcern: majority 就可以读到你刚才的写入了。
作者回复: 完整的事务包括ACID。你的理解和大部分程序员一样,更加关注的是里面的A: Atomicty。 就是几个操作要group为一个原子操作,要么全部成功,要么回滚所有操作。
作者回复: 如果用majority 读,肯定返回是2