我试图理解这一点。
cassandra 批处理始终是原子的,如果批处理仅修改单个表的单个分区,则该批处理也是隔离的。
但是对于由同一个键分区的多表批次呢?假设这个表:
orders (
order_id pk,
created_at,
user_id
)
order_items (
order_id,
product_id,
quantity,
primary key (order_id, product_id)
)
两个表都由相同的键分区。如果我想自动创建订单,假设 order_id = 123,如下所示:
begin batch
insert into orders ... (123)
insert into order_items .... where order_id = 123
insert into order_items .... where order_id = 123
apply batch
这个批次是原子的并且是隔离的吗?前提是 123 的orders 表分区和123 的order_items 表分区位于同一节点。
仅当批处理写入单个分区时才能实现隔离,因为根据定义,只有一个分区 - 没有其他分区需要隔离。
对于多分区批处理,Cassandra 只能保证 (1) 原子性,以及 (2) 批处理内语句的顺序,但 (3) 不能保证隔离,因为 (4) 任何客户端(应用程序实例)都可以读取已写入的行即使批次中仍有行需要处理。
我还应该指出,分区器的哈希算法是确定性的,因此分区键将始终被哈希为相同的令牌值。我提到这一点的原因是您两次提到分区“在同一节点上”。如果这些分区都具有相同的分区键,则任何表中的分区将始终位于相同的副本上,因此“在同一节点上”在本讨论中是无关紧要的。干杯!