【发布时间】:2019-09-16 16:22:14
【问题描述】:
如何从 Cassandra 中删除一行并获得删除前的值?
我可以连续执行SELECT 和DELETE 查询,但我如何确保在这两个查询执行之间数据没有同时更改?
我尝试批量执行SELECT 和DELETE 查询,但这似乎是不允许的。
cqlsh:foo> BEGIN BATCH
... SELECT * FROM data_by_user WHERE user = 'foo';
... DELETE FROM data_by_user WHERE user = 'foo';
... APPLY BATCH;
SyntaxException: line 2:4 mismatched input 'SELECT' expecting K_APPLY (BEGIN BATCH [SELECT]...)
在我的用例中,我有一个存储项目数据的主表。我已经建立了几个表,允许根据这些信息查找项目。 如果我从主表中删除一个项目,我也必须从其他表中删除它。
CREATE TABLE items (id text PRIMARY KEY, owner text, liking_users set<text>, ...);
CREATE TABLE owned_items_by_user (user text, item_id text, PRIMARY KEY ((user), item_id));
CREATE TABLE liked_items_by_user (user text, item_id tect, PRIMARY KEY ((user), item_id));
...
如果我删除一个项目并且同时删除某个人,我担心这些表格可能包含错误的数据,例如点击同一项目的点赞按钮。
-
deleteItem方法执行SELECT查询以从主表中获取项目的当前行 - 同时执行的
likeItem方法运行UPDATE查询并将项目插入owned_items_by_user、liked_items_by_user、...表。这发生在执行SELECT语句之后,并且在DELETE查询之前执行UPDATE查询。 -
deleteItem方法根据刚刚通过SELECT语句检索到的数据从owned_items_by_user、liked_items_by_user、... 表中删除项目。该数据尚不包含刚刚添加的like。该项目因此被删除,但刚刚添加的点赞仍保留在liked_items_by_user表中。
【问题讨论】: