【发布时间】:2021-11-19 17:33:26
【问题描述】:
CREATE TABLE table (
id1 uuid,
bucket timestamp,
createdat timestamp,
id2 uuid,
data blob,
primary key((id1, bucket), createdat, id2)
)
with
clustering ORDER BY (createdat ASC, id2 ASC) AND ...
我有这张 Cassandra 桌子。在多线程环境中,两个线程可以同时向该表插入行。
我有一个要求,表不应该有两行具有相同的(id1,bucket)和data 字段具有值null。
这意味着只有表的最后一行(对于每个id1 和bucket)可以将data 设置为null。
为了在每次插入之前实现这一点,我查询表的最后一行并仅在 data 字段不为空时插入新行。
由于竞争条件,这不起作用。两个线程都检查,获取没有data 的最后一行为空并插入具有null 的行,因此违反了要求。
我认为可以在数据库级别解决此问题。我需要一些首先检查最后一行然后插入新行的事务。在这些动作之间不应插入任何内容。
您能否提示如何在 Cassandra 上实现这一点?
【问题讨论】:
标签: database multithreading cassandra transactions