我需要在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用作数据库,因为这是客户的要求。 有没有更好的办法 ? 编辑