Cassandra写入超时错误并且没有发生回滚

时间:2016-03-09 01:59:11

标签: cassandra

我有一个复制因子1的节点并在该节点上触发批处理语句查询,cassandra写入数据但未能在超时限制内确认。然后它给出了一个带有以下stacktrace的写入时间异常。

failed `Exception in thread "main" com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency ONE (1 replica were required but only 0 acknowledged the write)
    at com.datastax.driver.core.exceptions.WriteTimeoutException.copy(WriteTimeoutException.java:54)
    at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:271)
    at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:187)
    at com.datastax.driver.core.Session.execute(Session.java:126)
    at jason.Stats.analyseLogMessages(Stats.java:91)
    at jason.Stats.main(Stats.java:48) 

然后,如果你回去查看表格,那么你会发现数据已被写入。所以我的问题是,如果cassandra给出了写入时间异常,那么它应该回滚更改。 我的意思是,如果我收到写入时间异常,我不想写入数据库,是否存在针对该特定方案的任何回滚策略。

2 个答案:

答案 0 :(得分:2)

根据您的描述,您期望的是Cassandra至少在A - Atomicity方面支持符合ACID的交易。 Cassandra不提供符合ACID的事务,而是依赖于最终的一致性来提供持久的数据存储。 Cassandra确实提供了Atomicity,因为节点上的单个分区是原子的,我的意思是整个行将被写入或不被写入。但是,写入仍然可以在一个或多个副本上成功,但在客户端设置超时之后。在这种情况下,客户端将收到错误但数据将被写入。没有什么可以回滚该交易。相反,群集中的数据将使用正常的修复机制变得一致。

我对你的建议是:

  1. 如果超时,请重试写入查询
  2. 调查在使用CL = ONE的写入时出现超时错误的原因。如果这是多DC设置,您尝试过CL = LOCAL_ONE。
  3. 有些文档可供阅读: https://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_atomicity_c.html https://docs.datastax.com/en/cassandra/2.1/cassandra/operations/opsRepairNodesReadRepair.html

答案 1 :(得分:1)

Cassandra没有任何回滚的概念。如果写入超时意味着写入可能已成功或可能没有。这就是C *试图将用户集中在幂等数据模型和结构上的原因。

实际执行某种条件写入的唯一方法是通过轻量级事务处理,允许进行一些检查和设置操作。