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

Transactions 在Cassandra中混合轻量级事务和正常写入,transactions,cassandra,compare-and-swap,Transactions,Cassandra,Compare And Swap,轻量级事务状态的 轻量级事务使用不同于正常操作的时间戳机制,混合LWT和正常操作可能会导致错误。如果轻量级事务用于写入分区内的行,则只能使用读写操作的轻量级事务 这是非常模糊的(顺便说一句,对于读取操作来说,LWT是什么意思?) 如果有人对卡桑德拉的内部结构有更深入的了解,他能否详细说明混合LWT和普通写入时可能出现的问题 我最好的猜测是并发性可能有问题(显然)。但是我认为如果我(例如)使用if NOT EXISTS插入一行,如果成功的话,我稍后会更新同一分区的UPDATE,我就可以了。我错了吗

轻量级事务状态的

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

这是非常模糊的(顺便说一句,对于读取操作来说,LWT是什么意思?)

如果有人对卡桑德拉的内部结构有更深入的了解,他能否详细说明混合LWT和普通写入时可能出现的问题


我最好的猜测是并发性可能有问题(显然)。但是我认为如果我(例如)使用
if NOT EXISTS
插入一行,如果成功的话,我稍后会更新同一分区的
UPDATE
,我就可以了。我错了吗?

我同意文件中关于LWT约束的内容不太准确,所以让我澄清一下:

  • 如果使用
    插入。。。如果不存在
    所有删除也应使用
    删除。。。如果存在
  • 如果使用
    更新表集column1=val1,其中column2=val2
    则column1和column2上的所有更新/插入也应使用LWT。常见用法是列1列2是同一列
实际上,LWT有4个回合:

  • 向给定分区的所有副本提议一个Paxos投票(一个timeuuid值)

  • 检查条件(
    如果不存在
    如果存在
    如果col=val
    )。如果不满足条件,请在此处失败

  • 否则,等待法定人数/当地法定人数接受Paxos投票

  • 提交并应用变异(
    插入
    更新
    删除

  • 步骤bc可以看作是一个比较和交换

    保证是所有使用LWT的写操作都可以彼此线性化,因此它们是原子的并且在分区上是隔离的

    现在如果您使用
    INSERT。。。如果不存在
    ,然后在没有LWT的情况下简单地删除,则会破坏LWT的目的,LWT担保不再适用

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


    对于LWT的条件更新也有相同的注释。

    关于分区中这组列的LWT读取的注释如何?其思想是,如果使用LWT,在读取成功之前,写入不会将结果返回给执行写入的客户端。因此,这意味着使用非LWT的读取不会对比较和设置阶段发生的操作产生影响,对吗?