在 Cassandra 中混合轻量级事务和正常写入
Posted
技术标签:
【中文标题】在 Cassandra 中混合轻量级事务和正常写入【英文标题】:Mixing lightweight transactions and normal writes in Cassandra 【发布时间】:2016-04-01 14:46:40 【问题描述】:Datastax documentation 用于轻量级事务状态:
“轻量级事务使用不同于普通操作的时间戳机制,混合 LWT 和普通操作会导致错误。如果轻量级事务用于写入分区内的行,则只有轻量级事务用于读取和应该使用写操作。”
这是非常模糊的(顺便说一句,LWT 用于读取操作是什么意思?)。
对 Cassandra 内部有更深入了解的人能否详细说明混合 LWT 和正常写入时可能出现的问题?
我最好的猜测是并发可能存在问题(显然)。但是我认为,如果我(例如)使用IF NOT EXISTS
插入一行并且如果那成功了,我稍后会在同一分区上执行UPDATE
,我会没事的。我错了吗?
【问题讨论】:
【参考方案1】:我同意文档在 LWT 约束方面不太准确,所以让我澄清一下:
如果你使用INSERT ... IF NOT EXISTS
,所有删除也应该使用DELETE ... IF EXISTS
如果您使用UPDATE table SET column1=val1 WHERE <filters> IF column2=val2
,那么 column1 和 column2 上的所有更新/插入也应该使用 LWT。 column1 和 column2 是同一列时的常见用法。
确实 LWT 有 4 轮:
向给定分区的所有副本提出 Paxos 投票(一个 timeuuid 值)
检查条件(IF NOT EXISTS
、IF EXISTS
或 IF col=val
)。如果条件不满足,就在这里失败
否则,请等待 QUORUM/LOCAL_QUORUM 接受 Paxos 投票
提交并应用突变(INSERT
、UPDATE
或 DELETE
)
步骤b和c可以看作是比较和交换。
保证所有使用 LWT 的写入彼此之间都是可线性化的,因此它们是原子的和隔离的 在分区上。
现在,如果您使用 INSERT ... IF NOT EXISTS
,然后使用简单的 DELETE
而不使用 LWT,您就违背了 LWT 的目的,并且 LWT 保证不再适用。
由于比较阶段(步骤 2)和提交阶段(步骤 4)在不同的步骤中,提供原子性的唯一方法是强制其他突变通过 LWT,否则逻辑会被破坏。
与 LWT 的条件更新相同。
【讨论】:
关于分区中这组列的 reads 的 LWT 的注释怎么样?这个想法是,如果使用 LWT,在读取成功之前,写入不会将结果返回给执行写入的客户端。那么,这意味着使用非 LWT 的读取不会对比较和设置阶段发生的操作产生影响,对吧?以上是关于在 Cassandra 中混合轻量级事务和正常写入的主要内容,如果未能解决你的问题,请参考以下文章