Cassandra-具有相同时间戳的混合列更新的冲突解决方案

Cassandra-具有相同时间戳的混合列更新的冲突解决方案,cassandra,Cassandra,我想知道,如果两个更新具有相同的客户端时间戳,哪一个写操作会获胜 初始数据:KeyA:{col1:“val AA”,col2:“val BB”,col3:“val CC”} 客户端1发送更新:KeyA:{col1:“val C1”,col2:“val B1”} 客户端2发送更新:KeyA:{col1:“val C2”,col2:“val B2”} 两个更新具有相同的时间戳 对KeyA行查询将返回什么结果 {col1:“val C1”,col2:“val B1”,col3:“val CC”}-Cl

我想知道,如果两个更新具有相同的客户端时间戳,哪一个写操作会获胜

初始数据:
KeyA:{col1:“val AA”,col2:“val BB”,col3:“val CC”}

客户端1发送更新:
KeyA:{col1:“val C1”,col2:“val B1”}

客户端2发送更新:
KeyA:{col1:“val C2”,col2:“val B2”}

两个更新具有相同的时间戳

KeyA
行查询将返回什么结果

  • {col1:“val C1”,col2:“val B1”,col3:“val CC”}
    -Clint 1获胜
  • {col1:“val C2”,col2:“val B2”,col3:“val CC”}
    -客户端2获胜
  • {col1:“val C2”,col2:“val B1”,col3:“val CC”}
    -混合更新
  • 我预计,这一结果是不可预测的——因为两个更新都有相同的时间戳


    混合场景也是可能的吗?

    时间戳是每列的属性,而不是整个插入本身。通过比较实际列值本身,可以解析具有相同精确时间戳的多个列。这是通过按字节对值进行词汇比较来实现的,因此返回的值是确定的


    因此,在您的示例中,如果两个客户端插入的每一列都具有相同的精确时间戳,则您可能会看到一个混合更新,具体取决于实际列值的比较方式。

    这里有一个链接,指向我不久前写的一篇关于冲突和冲突的文章。

    在我上面的示例中,混合更新是不可能的,但这仅仅是因为来自客户端2的列值具有更高的字节值-对吗?Cassandra提供了原子写入和隔离级别-但这只能保证1)单行上的突变将作为整体应用,或者2)在所有列写入后,被拒绝的突变将可见。但单次变异为单行存储了10列这一事实并不意味着所有这10列都将通过读取查询返回,因为具有相同时间戳的第二次并行变异可以为相同的列存储其他值。对吗?是的,在您的示例中,将返回来自客户端2的值。此外,行级隔离也不能保证如果写入中的列的时间戳不是最新的可用时间戳,那么将返回写入中的值。具有集合类型的列如何处理冲突?