Cassandra轻量级交易混乱

时间:2020-04-10 06:29:27

标签: cassandra

对于轻量级交易的术语,我有点困惑。我不确定为什么在大多数卡桑德拉文献中都说它仅适用于单个分区。

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

但是,在《定义指南》(Cassandra)一书中,我看到了这个示例

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;

此命令检查是否存在带有分区键的记录,该记录针对此表由Confirm_number组成。因此,让我们找出第二次执行此命令时发生的情况:

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会有用地回显​​包含故障指示和您尝试输入的值的行。

enter image description here

现在我的问题是是否要运行另一个查询

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

这不是错误的陈述吗?请让我知道我是否误解了

1 个答案:

答案 0 :(得分:0)

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

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