轻量级事务状态的Datastax documentation:
"轻量级事务使用与正常操作不同的时间戳机制,混合LWT和正常操作可能导致错误。如果使用轻量级事务来写入分区中的行,则只应使用读取和写入操作的轻量级事务。"
这是非常模糊的(顺便说一下,LWT对于读取操作甚至意味着什么?)。
对Cassandra内部人员有更深入了解的人是否可以在混合LWT和正常写入时详细说明可能出现的问题?
我最好的猜测是并发性(显然)可能存在问题。但我想如果我(例如)使用IF NOT EXISTS
插入一行,如果成功,我稍后会对UPDATE
进行相同的分区,我会没事的。我错了吗?
答案 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轮:
向给定分区的所有副本提出Paxos选票(timeuuid值)
检查条件(IF NOT EXISTS
,IF EXISTS
或IF col=val
)。如果不满足条件,请在此处失败
否则,请等待 QUORUM / LOCAL_QUORUM 接受Paxos投票
提交并应用变异(INSERT
,UPDATE
或DELETE
)
步骤 b 和 c 可视为比较和交换。
保证使用LWT 所有写入相对于彼此可线性化,因此它们是原子和隔离< / strong>在分区上。
现在如果您使用INSERT ... IF NOT EXISTS
然后使用简单DELETE
而不使用LWT,则会破坏LWT的目的并且LWT保证不再适用。
由于比较阶段(步骤2)和提交阶段(步骤4)处于不同的步骤,提供原子性的唯一方法是强制其他突变通过LWT,否则逻辑被破坏。
与LWT的条件更新相同。