【问题标题】:Cassandra - Distributed Row Locking for Select AND UpdateCassandra - 用于选择和更新的分布式行锁定
【发布时间】:2022-01-17 22:32:16
【问题描述】:

我有一个在连接到 Cassandra DB 的两个区域的多台机器上运行的微服务。我有以下表结构。

CREATE TABLE gifts (
  gift_id text,
  user_id text
  PRIMARY KEY gift_id
);

该表包含礼物ID列表。

在多个并发请求期间,必须为每个用户分配一个唯一的礼物,即选择一个随机的 gift_id 并更新 user_id。

LWT 是否有助于解决这个问题?

限制:

  • 不能使用 zookeeper 进行锁定
  • 不能使用任何关系数据库。

【问题讨论】:

  • 您正在使用 Cosmos,因此值得注意的是,LWT 在 Cosmos 中不完全支持(例如,仅单区域)。

标签: java concurrency cassandra microservices azure-cosmosdb


【解决方案1】:

请注意,LWT 不会影响 SELECTs。通常的 last-writer-wins 和可调一致性语义适用(尽管运行具有一致性级别 ALLSELECT 保证您将看到来自最新的 INSERT/UPDATE 的写入(在 Cassandra 中最好是认为相同:INSERT 具有 upsert 语义))。

您可以使用LWTs 来确保没有两个用户共享gift_id。只需 INSERTIF NOT EXISTS 如果礼物与用户相关联,它就不能与任何其他用户相关联。或者,您可以使用SELECT user_id FROM gifts WHERE gift_id = ...,然后使用INSERTIF user_id = the_user_id_from_the_select

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2019-02-12
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多