【问题标题】:LightWeight Transcation in cassandracassandra 中的轻量级事务
【发布时间】:2023-08-11 09:03:01
【问题描述】:

我有两个关于 cassandra 中的 LightWeight Transcation 的问题,

1) 将为以下两个查询提供什么级别的锁定(行?列?表?级别锁定)?

i) INSERT INTO user (user_id, user_name, user_phone, timestamp) VALUES(1,'uma', 9003934069, 4331312423232) IF EXISTS;
ii)  UPDATE user SET user_name = 'harry' where user_id=1 IF timestamp=4331312423232;

2) 如果 LWT 提供锁定机制,为什么我们需要在 READ 中设置 SERIAL 一致性?我的意思是,如果正在进行任何有条件的更新,为什么我们需要在上面进行串行一致性?

如果有人能对此做出回应,那就太好了。

谢谢, 哈利

【问题讨论】:

    标签: cassandra cassandra-2.0 cqlsh cassandra-3.0 cassandra-2.1


    【解决方案1】:

    Cassandra 不提供锁机制,IF NOT EXISTS 是轻量级事务。

    为了获得可线性化的一致性,我们需要通过单个主节点路由所有请求。在像 cassandra 这样的完全分布式系统中,它不太明显。

    Cassandra 使用 paxos 协议实现线性化一致性。

    Paxos 共识协议允许分布式系统使用基于 quorum 的算法就提案达成一致,不需要 master 并且没有两阶段提交的问题。 Paxos 有四个阶段:准备/承诺、读取/结果、提议/接受和提交/确认

    Cassandra 在提出轻量级事务的节点和集群中任何需要的副本之间进行四次往返,以确保正确执行,从而影响性能。

    这听起来成本很高——也许太高了。这就是 Cassandra 可以抛出超时异常的原因。因此,为绝对必要的情况保留轻量级事务

    来源: http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_ltwt_transaction_c.html https://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0

    【讨论】:

    • 你能解释一下LWT将提供什么吗?我们需要在哪里使用它?
    • LWT 提供了一种方法来确保事务隔离级别类似于 RDBMS 提供的可序列化级别。
    • 假设来自节点 1 的 T1 尝试更新第 1 行,同时来自节点 2 的 T2 尝试更新相同的第 1 行,LWT 将如何阻止它?
    • 两个用户试图在同一个集群中创建一个唯一的用户帐户可能会在两个用户都不知道的情况下覆盖彼此的工作,在这种情况下需要强一致性
    • 事务 t1 或 t2 中的一个会失败