【问题标题】:How to achieve row level locking in cassandra如何在 cassandra 中实现行级锁定
【发布时间】:2019-07-18 14:49:37
【问题描述】:

我有一个 Cassandra 集群设置,例如 Node N1、Node N2 和 Node N3

我有一个用户表,我需要在集群中的节点上为它创建一个行级锁定,所以请您指导我回答以下问题吗?

1) Cassandra 中可能的最大锁定级别是多少?
2)什么是轻量级交易?行级锁定能实现多少?
3) Cassandra 中是否有另一种实现行级锁定的方法?

【问题讨论】:

    标签: java database cassandra locking


    【解决方案1】:
    1. 没有,但您可以将其延伸到列级别。
    2. 它使用 paxos 达成共识,可以执行条件更新。它不做锁定。如果发生另一个更新,它会成功或不成功,如果它不成功,你可以再试一次。如果它确实成功了,那么“事务”中的所有内容(命名不佳)都将适用。但是,其中仍然没有隔离,如果行中的多个列被更新,您可能会在它们之间读取它们正在应用。 details here
    3. 设计数据模型,使您不需要锁定。

    【讨论】:

    • 你怎么能说设计一个数据模型不需要锁定呢?如果我们需要行级锁定,如何在 Cassandra 中实现?
    • 诸如事件溯源、crdt 等策略。在 datastax 学院 (academy.datastax.com) 或 youtube 上有一些关于数据建模的好资源。在大多数情况下,您可以在需要并发安全性的情况下使用 LWT(例如更新余额、确保用户名是唯一的等),但它确实以性能为代价。我建议在没有它的情况下尽可能多地做。请记住,更新银行账户余额等事情不是通过行锁定来完成的,而是通过记录每笔交易并从中计算总计。
    • 1) cassandra 如何做到这一点'更新银行账户等的余额不是通过行锁定来完成的,而是通过记录每笔交易并从中计算总数。 ' ? 2)什么是paxos共识协议?它如何为特定行提供并发写入?
    • 它实际上确实具有比较和交换或 CAS 的乐观锁定。尽管在内部它比那更复杂。它在上面的 [详细信息] 中进行了解释,比我更好地解释了它。它有点像在 java 中具有用于无锁算法的所有 Atomic____ 类。你给出一个更新和一个条件,它要么全部发生,要么都不发生。对于像天平这样的东西,它的条件是天平=你读它的样子。如果在您阅读余额并应用更新后发生其他更改,则它无法应用,因此您重新阅读并重试。
    • 1) 记录每个事务并定期记录保存在内存或 redis 或其他东西中的“当前”。定期冲洗此电流。确实有不同的方法(即 lambda 架构en.wikipedia.org/wiki/Lambda_architecture)。将值存储在 C* 中,以防重建当前失败。 2) paxos 确实是一个实现细节,您无需担心它,但如果有兴趣并且有很多资源,您可以谷歌搜索它。它是一种分布式共识算法,用于许多易于扩展的数据库。
    【解决方案2】:

    cassandra 中没有事务,没有锁定。然而,有轻量级交易。它们不是很好,性能更差,并且有很多权衡。

    根据此锁的用例,您可以执行以下操作: INSERT INTO User (userID, email) VALUES (‘MyGuid’, ‘user@example.com’) IF NOT EXISTS;

    如果查询返回错误/失败,您必须处理它,如果有人在您之前插入,它不会只是失败。失败也可能意味着您的 1 个节点确实获得了写入,但不是全部。 LWT 不回滚。

    【讨论】:

    • 1) 轻量级事务如何提供行级锁定?我无法从这篇文章中理解'datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0' 2)示例:考虑到这种情况,线程 1 尝试从用户表中读取第 1 行,同时,线程 2 尝试从用户表中删除第 1 行,您将如何使用轻量级事务为此提供锁定以及使用的查询/语法是什么?
    • 你也说没有锁,那为什么运行轻量级事务的查询会出现性能问题?
    • 需要建立额外的连接来支持if not exists并成功返回。在你上面的例子中。考虑软删除用户(使用 isDeleted 列)。大多数情况下,除非您试图支持遗忘权,否则您实际上并不想删除该数据。
    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多