在Cassandra中混合轻量级事务和普通写入

st_*_*ick 6 transactions cassandra compare-and-swap

轻型事务的Datastax文档指出:

“轻量级事务使用的时间戳机制与正常操作不同,并且混合LWT和正常操作会导致错误。如果轻量级事务用于在分区内的行中写入,则应仅对读写操作使用轻量级事务。 ”

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

混合LWT和普通写入时,对Cassandra内部知识有更深入了解的人可以详细说明可能出现的问题吗?

我最好的猜测是并发性可能存在问题(显然)。但是我以为,如果我(例如)使用插入了一行,IF NOT EXISTS并且如果成功的话,我以后再UPDATE对同一分区进行处理,那会很好。我错了吗?

doa*_*hai 7

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

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

的确,LWT有四轮比赛:

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

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

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

  4. 提交并应用突变(INSERT,UPDATE或DELETE)

步骤b和c可以视为“ 比较并交换”。

该保证是所有写操作使用LWT是线性化相对于每个人的,所以他们是原子和隔离的分区。

现在,如果你使用INSERT ... IF NOT EXISTS,然后简单的DELETE无LWT,你打败LWT和LWT担保的目的不再适用。

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

使用LWT进行条件更新的备注相同。