2016-08-01 3 views
3

Я хочу выполнить транзакцию с несколькими операциями записи (~ 5 вставок/обновлений в разные таблицы) в Cassandra, но если какой-либо из них не работает, то остальные не должны записываться (либо откат каждой операции, либо отказ всей транзакции).Как выполнить транзакцию с несколькими операциями в Cassandra

Пожалуйста, сообщите мне, что подходит для выполнения этого в Кассандре и как это сделать (пример будет приветствоваться).

ответ

1

Да, вы можете использовать зарегистрированную функциональность партии для выполнения этого атомарно. Обратите внимание, что вы получаете удар по производительности. См. Раздел документации BATCH Statements драйвера C++.

Вот пример того, как это сделать на C++, взятом из приведенной выше документации. Он Демос, показывающий, как партия INSERT, UPDATE и DELETE вместе:

/* 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); 
+0

Привет Аарон, спасибо за обстоятельный ответ. Может быть, это транзакция Кассандры? Поскольку вы упомянули о производительности, связанной с использованием пакетной функциональности Cassandra, есть ли альтернативное решение с лучшей производительностью? Заранее спасибо. – gliatsos

+0

@GeorgeL Это похоже на реализацию транзакций в других базах данных. Главное отличие состоит в том, что в Cassandra вы попадаете в хит-центр (около 30% или около того), потому что он должен использовать узел-координатор для общения со всеми узлами, на которые может повлиять ваша партия. В то время как в мире РСУБД считается улучшением производительности для пакетных нескольких операторов в «транзакцию». Вы можете сделать так называемую «незашифрованную партию» за меньшее количество ударов по производительности, но не зависящая от партии партия не может делать никаких гарантий для атомарности, если ваши пакетные утверждения влияют на несколько разделов. – Aaron

Смежные вопросы