在Cassandra中混合轻量级事务和正常写入

时间:2016-04-01 14:46:41

标签: transactions cassandra compare-and-swap

轻量级事务状态的Datastax documentation

"轻量级事务使用与正常操作不同的时间戳机制,混合LWT和正常操作可能导致错误。如果使用轻量级事务来写入分区中的行,则只应使用读取和写入操作的轻量级事务。"

这是非常模糊的(顺便说一下,LWT对于读取操作甚至意味着什么?)。

对Cassandra内部人员有更深入了解的人是否可以在混合LWT和正常写入时详细说明可能出现的问题?

我最好的猜测是并发性(显然)可能存在问题。但我想如果我(例如)使用IF NOT EXISTS插入一行,如果成功,我稍后会对UPDATE进行相同的分区,我会没事的。我错了吗?

1 个答案:

答案 0 :(得分:5)

我同意文档在LWT约束方面不太准确,所以让我澄清一下:

  • 如果您使用INSERT ... IF NOT EXISTS所有删除也应使用DELETE ... IF EXISTS
  • 如果您使用UPDATE table SET column1=val1 WHERE <filters> IF column2=val2,那么第1列和第1列的所有更新/插入column2也应该使用LWT。常见的用法是 column1 column2 是同一列。

确实LWT有4轮:

  1. 向给定分区的所有副本提出Paxos选票(timeuuid值)

  2. 检查条件(IF NOT EXISTSIF EXISTSIF col=val)。如果不满足条件,请在此处失败

  3. 否则,请等待 QUORUM / LOCAL_QUORUM 接受Paxos投票

  4. 提交并应用变异(INSERTUPDATEDELETE

  5. 步骤 b c 可视为比较和交换

    保证使用LWT 所有写入相对于彼此可线性化,因此它们是原子隔离< / strong>在分区上。

    现在如果您使用INSERT ... IF NOT EXISTS然后使用简单DELETE而不使用LWT,则会破坏LWT的目的并且LWT保证不再适用。

    由于比较阶段(步骤2)和提交阶段(步骤4)处于不同的步骤,提供原子性的唯一方法是强制其他突变通过LWT,否则逻辑被破坏。

    与LWT的条件更新相同。