我有两张下面的模型表:
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表中键的一部分,我需要先删除该行并插入一个新行。 以下是我需要以批处理方式执行的三个操作(要么所有操作都要成功执行,要么不执行任何操作)
由于INV表正在被多个线程访问,我需要确保在更新INV表行之前它自上次读取以来没有被更改过。 我正在使用LWT事务来使用VERSON列更新INV表并批量操作以便在LOOK_INV表中删除和插入。我想批量添加所有三个操作。但由于LWT在批处理中是不可接受的,我需要以上述方式执行。
这种方法的问题在于,在某些情况下批处理执行成功,但更新INV表会导致超时异常,并且数据在表中都不存在。
cassandra是否提供了优雅处理这类场景的功能?
答案 0 :(得分:2)
轻量级交易(LWT)的注意事项
由于您遇到的性能问题,轻量级交易目前被认为是Cassandra反模式。
这里有一些上下文要解释。
Cassandra不会将RDBMS ACID事务与回滚或锁定机制一起使用。由于对称为CAP Theorem的各种分布式数据存储的基本约束,它不提供锁定。它指出,分布式计算机系统不可能同时提供以下所有三种保证:
因此,Cassandra不适合原子操作,你不应该为此目的使用Cassandra。
它提供轻量级事务,在某些情况下可以替换锁定。但由于Paxos协议(LWT的基础)涉及节点之间发生的一系列操作,因此在提出LWT的节点与作为事务一部分的其他副本之间将有多次往返。
这会对性能产生负面影响,并且是WriteTimeoutException错误的一个原因。在这种情况下,您无法知道是否已应用LWT操作,因此您需要重试它以便回退到稳定状态。由于LWT非常昂贵,因此驱动程序不会自动为您重试。
如果频繁使用,LTW会带来很大的性能损失,我们会看到一些客户因使用LWT而出现超时问题。
轻量级交易通常是一个坏主意,应该不经常使用。
如果您确实需要部分工作负载的ACID属性但仍需要进行扩展,请考虑将负载的这一部分转移到cochroach BD。 总之,如果您确实需要ACID交易,那么引入第二种技术通常要容易得多。