st_*_*ick 6 transactions cassandra compare-and-swap
轻型事务的Datastax文档指出:
“轻量级事务使用的时间戳机制与正常操作不同,并且混合LWT和正常操作会导致错误。如果轻量级事务用于在分区内的行中写入,则应仅对读写操作使用轻量级事务。 ”
这非常模糊(顺便说一句,对于读操作,LWT甚至意味着什么?)。
混合LWT和普通写入时,对Cassandra内部知识有更深入了解的人可以详细说明可能出现的问题吗?
我最好的猜测是并发性可能存在问题(显然)。但是我以为,如果我(例如)使用插入了一行,IF NOT EXISTS并且如果成功的话,我以后再UPDATE对同一分区进行处理,那会很好。我错了吗?
我同意该文档在LWT约束方面不太准确,因此让我澄清一下:
INSERT ... IF NOT EXISTS,则所有删除操作也应使用DELETE ... IF EXISTSUPDATE table SET column1=val1 WHERE <filters> IF column2=val2则column1和column2上的所有更新/插入也应使用LWT。常见用法是column1和column2是同一列。的确,LWT有四轮比赛:
向给定分区的所有副本提出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进行条件更新的备注相同。
| 归档时间: |
|
| 查看次数: |
626 次 |
| 最近记录: |