【问题标题】:Cassandra light weight transaction confusionCassandra 轻量级事务混淆
【发布时间】:2020-04-10 16:41:05
【问题描述】:

我对轻量级交易的术语感到有些困惑。我不确定为什么在大多数 cassandra 文献中都说它仅适用于单个分区。

就像我使用 IF NOT EXISTS,IF EXISTS 时一样,它应该适用于整个主键,而不仅仅是分区键,正如它在这篇文章中所说的那样How the LWT- Light Weight Transaction is working when we use IF NOT EXIST?

但是,在 Cassandra, the Definition Guide 一书中,我看到了这个例子

INSERT INTO reservation.reservations_by_confirmation 
(confirm_number,
hotel_id, start_date, end_date, room_number, guest_id) VALUES (
'RS2G0Z', 'NY456', '2020-06-08', '2020-06-10', 111, 1b4d86f4-ccff- 
4256-a63d-45c905df2677) IF NOT EXISTS;

此命令检查是否存在带有分区键的记录,该表由确认编号组成。那么让我们看看当你第二次执行这个命令时会发生什么:

INSERT INTO reservation.reservations_by_confirmation 
(confirm_number,
hotel_id, start_date, end_date, room_number, guest_id) VALUES (
'RS2G0Z', 'NY456', '2020-06-08', '2020-06-10', 111, 1b4d86f4-ccff- 
4256-a63d-45c905df2677) IF NOT EXISTS;

在这种情况下,事务失败,因为已经有一个编号为“RS2G0Z”的预留,并且 cqlsh 有助于回显包含失败指示和您尝试输入的值的行。

现在我的问题是,如果我运行,另一个查询

INSERT INTO reservation.reservations_by_confirmation 
(confirm_number,
hotel_id, start_date, end_date, room_number, guest_id) VALUES (
'RS2G0Z', 'NY466', '2020-06-08', '2020-06-10', 111, 1b4d86f4-ccff- 
4256-a63d-45c905df2677) IF NOT EXISTS;

主键不同但分区键相同,应该成功

所以当书上说

This command checks to see if there is a record with the partition key

这不是错误的说法吗?如果我误解了某些内容,请告诉我

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    这是书中的错误,虽然图表显示了复杂的主键,但表 reservation.reservations_by_confirmation 具有非常简单的主键 - confirm_number,因此在这种情况下,查询按文中所述进行,并且不允许插入重复的主键。

    当您看到在 LWT 上下文中提到分区键时,这通常意味着协调发生在具有给定分区副本的节点之间...

    【讨论】:

    • Alex 是正确的,图中有错误。这本书的第二次印刷将反映一个与本章后面介绍的模式相匹配的更正图表。