如何在Cassandra中执行批处理语句和LWT作为事务

我有两张下面的模型表:

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表中键的一部分,我需要先删除该行并插入一个新行。 以下是我需要以批处理方式执行的三个操作(要么所有操作都要成功执行,要么不执行任何操作)

  1. 从LOOK_INV表中删除行。
  2. 在LOOK_INV表中插入行。
  3. 更新INV表中的QUANTITY和CHECK_INDICATOR。

由于INV表正在被多个线程访问,我需要确保在更新INV表行之前它自上次读取以来没有被更改过。 我正在使用LWT事务来使用VERSON列更新INV表并批量操作以便在LOOK_INV表中删除和插入。我想批量添加所有这三个操作。但由于LWT在批处理中是不可接受的,我需要以上述方式执行。

这种方法的问题在于,在某些情况下批处理执行成功,但更新INV表会导致超时exception,并且数据在表中都不存在。

cassandra是否提供了优雅处理这类场景的function?

轻量级交易(LWT)的注意事项

由于您遇到的性能问题,轻量级事务目前被认为是Cassandra反模式。

这里有一些上下文要解释。

Cassandra不会将RDBMS ACID事务与回滚或锁定机制一起使用。 由于对称为CAP定理的各种分布式数据存储的基本约束,它不提供锁定。 它指出,分布式计算机系统不可能同时提供以下所有三种保证:

  • 一致性(所有节点同时看到相同的数据)
  • 可用性(保证每个请求都收到有关它是成功还是失败的响应)
  • 分区容差(尽管任意消息丢失或部分系统出现故障,系统仍继续运行)

在此处输入图像描述

因此,Cassandra不适合primefaces操作,你不应该为此目的使用Cassandra。

它确实提供轻量级事务,在某些情况下可以替换锁定。 但是因为Paxos协议(LWT的基础)涉及在节点之间发生的一系列动作,所以在提出LWT的节点和作为事务的一部分的其他副本之间将存在多次往返。

这会对性能产生负面影响,这也是WriteTimeoutException错误的一个原因。 在这种情况下,您无法知道是否已应用LWT操作,因此您需要重试它才能回退到稳定状态。 由于LWT非常昂贵,因此驱动程序不会自动为您重试。

如果频繁使用,LTW会带来很大的性能损失,并且我们会看到一些客户因使用LWT而出现超时问题。

轻量级交易通常是一个坏主意,应该不经常使用。