我有两个模型如下的表:
CREATE TABLE IF NOT EXISTS INV (
CODE TEXT,
PRODUCT_CODE TEXT,
LOCATION_NUMBER TEXT,
QUANTITY DECIMAL,
CHECK_INDICATOR BOOLEAN,
VERSION BIGINT,
PRIMARY KEY ((LOCATION_NUMBER, PRODUCT_CODE)));
CREATE TABLE IF NOT EXISTS LOOK_INV (
LOCATION_NUMBER TEXT,
CHECK_INDICATOR BOOLEAN,
PRODUCT_CODE TEXT,
CHECK_INDICATOR_DDTM TIMESTAMP,
PRIMARY KEY ((LOCATION_NUMBER), CHECK_INDICATOR, PRODUCT_CODE))
WITH CLUSTERING ORDER BY (CHECK_INDICATOR ASC, PRODUCT_CODE ASC);
我有一个业务操作,需要更新表中的 CHECK_INDICATOR 和 INV 表中的 QUANTITY。
由于 CHECK_INDICATOR 是 LOOK_INV 表中键的一部分,我需要先删除该行并插入新行。
以下是我需要以批处理方式执行的三个操作(要么全部成功执行,要么不执行)
- 从 LOOK_INV 表中删除行。
- 在 LOOK_INV 表中插入行。
- 更新 INV 表中的 QUANTITY 和 CHECK_INDICATOR。
由于 INV 表正在被多个线程访问,因此我需要在更新 INV 表行之前确保它自上次读取以来尚未更改。
我正在使用 LWT 事务来更新 INV 表,使用 VERSON 列和批量操作在 LOOK_INV 表中进行删除和插入。我想批量添加所有三个操作。但是由于 LWT 在批量中不可接受,因此我需要以上述方式执行。
这种方法的问题是,在某些情况下批处理成功执行,但更新 INV 表会导致超时异常,并且两个表中的数据变得不一致。
cassandra是否提供了任何功能来优雅地处理此类场景?