使用轻量级交易有什么影响?

时间:2016-01-14 13:20:08

标签: transactions cassandra datastax-java-driver

特别是我在看this page所说的内容:

  

如果使用轻量级事务来写入分区中的行,则只应使用读取和写入操作的轻量级事务。

我对使用LWT进行读取操作的样子感到困惑。具体来说,这与每个查询的一致性(和serialConsistency)级别有什么关系。

SERIAL读取一致性description引发了更多问题:

  

允许在不提议添加或更新的情况下读取当前(可能未提交)的数据状态。

这表明使用SERIAL进行读取不是"使用LWT"。

但是

  • 当您进行阅读时,Cassandra如何知道检查正在进行的交易?
  • 您尝试阅读时提出的新更新是什么,这对阅读有何影响?
  • 如果您正在阅读的一致性(例如ONE)小于用于撰写的serialConsistency,那该怎么办?
  • 在桌面(或行?或列?)上使用LWT后,是否所有非SERIAL读取都被迫接受参与仲裁和交易算法的惩罚?
  • 请求是否实际应用于整行,或者只是条件语句中涉及的列?

如果我忽略此建议并进行串行和非串行读/写。 LWT以何种方式失败?

1 个答案:

答案 0 :(得分:10)

  

Cassandra如何知道在您检查正在进行的交易时   读一读吗?

这正是<string name="welcome_text">Welcome to CompanyName</string> <string name="welcome_text_bold">CompanyName</string> 一致性级别所指示的内容。它确保查询仅在完全执行所有挂起事务后返回结果。

  

在您尝试阅读时提出的新更新是什么,   这对读取有何影响?

我认为文档试图说的是读取将像LWT一样处理 - 只是没有对它自己进行任何更新。

  

如果您正在阅读的一致性(比如说一个)小于用于写作的serialConsistency,那该怎么办?

使用SERIAL进行的读取始终意味着SERIAL作为一致性级别。使用QUORUM阅读不会为ONE提供任何保证,您最终可能会阅读停滞不前的数据。

  

在桌面上使用LWT(或行?或列?)后,是否所有非SERIAL读取都被迫接受参与仲裁和交易算法的惩罚?

没有。您可以对查询使用非SERIAL一致性级别,并使用与任何其他非串行查询完全相同的性能特征执行它们。

  

请求是否实际应用于整行,或仅适用于条件语句中涉及的列?

不,我认为只要您使用不同的列进行串行读/写(包括条件)和常规读/写,您就应该没问题。

  

如果我忽略此建议并进行串行和非串行读/写。 LWT以何种方式失败?

如果执行常规写入,而不是作为LWT的一部分执行,那些写入将随时应用,而不会干扰LWT的共识过程。因此,理论上,常规写入可以在评估条件和应用更新之间的某个时间更改作为LWT条件一部分的值,这可能是您希望避免使用LWT的不一致的原因。