Cassandra 卡桑德拉LWT阅读

Cassandra 卡桑德拉LWT阅读,cassandra,lwt,Cassandra,Lwt,据我所知,LWT插入始终以串行一致性级别完成。如果为true,是否意味着读取作为LWT插入的行可以安全地以任何一致性级别读取 换句话说,我假设LWT插入完全一致,使得任何后续读取也完全一致,而不管一致性级别如何?您的假设是不正确的,原因有两个 串行仅表示写入的仲裁一致性级别 有可能在读取时仅部分应用单个LWT,因此无法使用任何CL安全读取 因此,您需要对所有将读取LWT写入的查询使用串行。这将确保在读取仲裁时没有挂起的LWT。ANY不是可接受的读取一致性级别:一个是最小值。任何内容仅供书面使用。

据我所知,LWT插入始终以串行一致性级别完成。如果为true,是否意味着读取作为LWT插入的行可以安全地以任何一致性级别读取


换句话说,我假设LWT插入完全一致,使得任何后续读取也完全一致,而不管一致性级别如何?

您的假设是不正确的,原因有两个

  • 串行仅表示写入的仲裁一致性级别
  • 有可能在读取时仅部分应用单个LWT,因此无法使用任何CL安全读取

  • 因此,您需要对所有将读取LWT写入的查询使用串行。这将确保在读取仲裁时没有挂起的LWT。

    ANY不是可接受的读取一致性级别:一个是最小值。任何内容仅供书面使用。@GQuintana,谢谢您的澄清。那么,一个是只读的,如果不是,任何一个和一个写的有什么区别?对于写,任何一个都意味着发出请求并忘记,而另一个意味着发出请求并等待一个副本确认。您不能使用任何for reads,因为您至少需要一个副本才能获得响应。我不理解您的第二点。Serial类似于Quorum(甚至更强)和Quorum+One>RF/2。LWT上下文中的“完全一致”意味着所有副本都已使用Quorum成功写入。如果在LWT仍在执行时执行读取,则可能会读取部分提交的结果。只有使用串行读取才能确保在这种情况下不会看到不完整的写入,因为串行读取可以确保没有挂起的LWT。@StefanPodkowinski,这是否适用于LWT包含一行读取和写入的情况?如果是这样,那是因为列是单独应用的吗?@nilskp LWTs总是只影响一行。在单次写入期间,列更新不会单独应用,因为单行分区键的所有列都将自动应用(在没有LWT的情况下也适用):@nilskp partial committed,如未完全写入/确认所有副本中一样。