У меня есть требование вести таблицу инвентаризации (inventory_table) в cassandra, в которой будет два элемента столбца и уровень запасов, которые будут обновляться очень часто и параллельно, так как клиенты покупают элементы в Интернете,
так что может случиться так, что между моим выбором и обновлением в моем приложении какой-то другой поток / процесс обновил те же данные, чтобы избежать этого несоответствия, я создал другую таблицу
CREATE TABLE LOCKED_items
(
LOCKED text,
item text,
lock_date timestamp,
PRIMARY KEY ((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;
это будет гарантировать, что я получу блокировки всех элементов один раз, и никакие другие потоки не обновятся между моими потоками выбора и обновления.
Мой вопрос: как это будет влиять на производительность этого механизма блокировки с точки зрения Кассандры?
Стоит ли это того, моё ограничение - использовать Кассандру только в качестве БД, поскольку это требование клиента.
Есть ли способ лучше ?
Edit