使用自定义锁定的Cassandra一致性

时间:2019-04-09 07:08:19

标签: cassandra datastax database-performance datastax-enterprise query-performance

我需要在cassandra中维护一个库存表(inventory_table),该表将具有两列物料,并且库存水平将非常频繁地更新,并且随着客户在线购买物料而并行进行, 因此,可能发生在我的应用程序的选择和更新之间,其他一些线程/进程更新了相同的数据,为避免这种矛盾,我创建了另一个表

CREATE TABLE LOCKED_items
(
LOCKED text,
item text,
lock_date timestamp,
PRIMARY KEY ((LOCKED),item)
);

在此表中,分区键为LOCKED,而群集键为item,因此所有锁(行)将位于同一分区中。

在我的交易开始之前,如果插入成功,我将使用轻量级交易在locked_items表中插入一行,然后只有我才能进一步工作,否则将重试插入,以便通过应用程序将业务逻辑隔离和原子化

insert into locked_item  (LOCKED,item,lock_date) values('Y','item1',toTimestamp(now())) IF NOT EXISTS;

我还要求我可以在有效负载中获取多项,并且所有项都应该成功或不成功,因为我将使用在单个分区上运行的批处理来锁定项

BEGIN BATCH
insert into locked_skus (LOCKED,sku,lock_date) values('Y','item5',toTimestamp(now())) IF NOT EXISTS;
insert into locked_skus (LOCKED,sku,lock_date) values('Y','item6',toTimestamp(now())) IF NOT EXISTS;
insert into locked_skus (LOCKED,sku,lock_date) values('Y','tem7',toTimestamp(now())) IF NOT EXISTS;
insert into locked_skus (LOCKED,sku,lock_date) values('Y','tem61',toTimestamp(now())) IF NOT EXISTS;
APPLY BATCH;

这将确保我将一次获得所有项目的锁,并且在选择和更新线程之间不会再有其他线程更新。

我的问题是,从cassandra的角度来看,此锁定机制的性能会产生什么影响, 值得吗,我的限制是必须将cassandra用作数据库,因为这是客户的要求。 有没有更好的办法 ? 编辑

0 个答案:

没有答案
相关问题