【问题标题】:How to perform a transaction with multiple operations in Cassandra如何在 Cassandra 中执行具有多个操作的事务
【发布时间】:2018-11-22 09:36:13
【问题描述】:

我想在 Cassandra 中执行具有多个写入操作(约 5 次插入/更新到不同表)的事务,但如果其中任何一个失败,则不应写入其余的(回滚每个操作或使整个事务失败) .

请告诉我在 Cassandra 中执行此操作的正确方法是什么以及如何操作(欢迎提供示例)。

【问题讨论】:

    标签: c++ cassandra


    【解决方案1】:

    是的,您可以使用记录批处理功能以原子方式完成此操作。请注意,您确实会影响性能。请参阅 C++ 驱动程序的 BATCH Statements 文档部分。

    这是一个如何在 C++ 中执行此操作的示例,取自上面的文档链接。它演示了如何将INSERTUPDATEDELETE 一起批处理:

    /* This logged batch will makes sure that all the mutations eventually succeed */
    CassBatch* batch = cass_batch_new(CASS_BATCH_TYPE_LOGGED);
    
    /* Statements can be immediately freed after being added to the batch */
    
    {
       CassStatement* statement
          = cass_statement_new(cass_string_init("INSERT INTO example1(key, value) VALUES ('a', '1')"), 0);
       cass_batch_add_statement(batch, statement);
       cass_statement_free(statement);
    }
    
    {
       CassStatement* statement
          = cass_statement_new(cass_string_init("UPDATE example2 set value = '2' WHERE key = 'b'"), 0);
       cass_batch_add_statement(batch, statement);
       cass_statement_free(statement);
    }
    
    {
       CassStatement* statement
          = cass_statement_new(cass_string_init("DELETE FROM example3 WHERE key = 'c'"), 0);
       cass_batch_add_statement(batch, statement);
       cass_statement_free(statement);
    }
    
    CassFuture* batch_future = cass_session_execute_batch(session, batch);
    
    /* Batch objects can be freed immediately after being executed */
    cass_batch_free(batch);
    
    /* This will block until the query has finished */
    CassError rc = cass_future_error_code(batch_future);
    
    printf("Batch result: %s\n", cass_error_desc(rc));
    
    cass_future_free(batch_future);
    

    【讨论】:

    • 嗨亚伦,感谢您的彻底回答。会不会是 Cassandra 交易?既然您提到使用 Cassandra 的批处理功能会影响性能,那么是否有任何替代解决方案具有更好的性能?提前谢谢你。
    • @GeorgeL 这类似于其他数据库中事务的实现。主要区别在于,在 Cassandra 中,您会受到性能影响(大约 30% 左右),因为它必须使用协调节点来与可能受批处理影响的所有节点进行通信。而在 RDBMS 世界中,将多个语句批处理成一个“事务”被认为是一种性能改进。您可以执行所谓的“未记录批处理”以减少对性能的影响,但如果您的批处理语句影响多个分区,则未记录批处理无法保证原子性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2015-07-16
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多