gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:08:23 24 4
gpt4 key购买 nike

Datastax documentation对于轻量级事务状态:

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

这是非常模糊的(顺便说一句,它们甚至对读取操作的 LWT 意味着什么?)。

对 Cassandra 内部结构有更深入了解的人能否详细说明混合 LWT 和正常写入时可能出现的问题?

我最好的猜测是并发可能存在问题(显然)。但我认为如果我(例如)使用 IF NOT EXISTS 插入一行如果那是成功的,我以后会做 UPDATE同一个分区,我会没事的。我错了吗?

最佳答案

我同意该文档对 LWT 约束不太准确,所以让我澄清一下:

  • 如果您使用 INSERT ... IF NOT EXISTS , 所有删除 还应该使用 DELETE ... IF EXISTS
  • 如果您使用 UPDATE table SET column1=val1 WHERE <filters> IF column2=val2那么 column1 和 column2 上的所有更新/插入也应该使用 LWT。一个常见的用法是当 第 1 列 第2列是同一列。

  • 事实上,LWT 有 4 轮:
  • 向给定分区的所有副本提出 Paxos 投票(timeuuid 值)
  • 检查条件( IF NOT EXISTSIF EXISTSIF col=val )。如果不满足条件,这里失败
  • 否则,等待 法定人数/ LOCAL_QUORUM 接受 Paxos 投票
  • 提交并应用突变( INSERTUPDATEDELETE )

  • 步骤 b c 可以看作是 比较和交换 .

    保证是 所有写入 使用 LWT 是 可线性化 相对于彼此,所以它们是 原子 隔离 分区上。

    现在,如果您使用 INSERT ... IF NOT EXISTS然后简单 DELETE没有 LWT,您就违背了 LWT 的目的,并且 LWT 保证不再适用。

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

    对 LWT 条件更新的评论相同。

    关于transactions - 在 Cassandra 中混合轻量级事务和正常写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36359301/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com