2012-08-07 77 views
1

我需要了解是否/如何調用MutationBatch.execute()對運行代碼的服務器是否安全下來。astyanax突變批次失敗處理

看看下面的代碼(從Astyanax例子複製)。我打算使用此代碼修改2個不同列家族中的2行。我需要確保(100%)如果執行此代碼的服務器在執行期間的任何時間點崩潰/失敗: - Cassandra數據存儲中沒有任何更改 - 全部更改(2行)應用於Cassandra數據存儲

我特別關注「OperationResult result = m.execute();」這行。我會假設這轉換成如下形式:將所有修改寫入Cassandra中的提交日誌,然後以原子方式觸發Cassandra內部執行的更改(以及Cassandra保證在某個服務器上執行)。

任何幫助,這是非常讚賞。

謝謝, Sven。

CODE:

MutationBatch m = keyspace.prepareMutationBatch(); 

long rowKey = 1234; 

// Setting columns in a standard column 
m.withRow(CF_STANDARD1, rowKey) 
    .putColumn("Column1", "X", null) 
    .putColumn("Column2", "X", null); 

m.withRow(CF_STANDARD1, rowKey2) 
    .putColumn("Column1", "Y", null); 

try { 
    OperationResult<Void> result = m.execute(); 
} catch (ConnectionException e) { 
    LOG.error(e); 
} 

回答

2

http://www.datastax.com/docs/0.8/dml/about_writes

在卡桑德拉,寫入是原子在行級,這意味着插入或更新列對於給定的行密鑰將被視爲一個寫入操作。 Cassandra不支持將多行更新捆綁成一個全有或全無操作的意義上的事務。

這意味着,沒有辦法100%確定,突變將更新兩個不同的行或沒有。但是自Cassandra 0.8以來,你至少會在單行內獲得這樣的保證 - 在單行內修改的所有列都會成功或者沒有 - 這是全部。

您可以將不同行上的突變看作單獨的事務,它們在單個突變調用內發送的事實不會改變任何內容。 Cassandra內部會將所有操作按行鍵組合在一起,並將每行的突變作爲獨立的原子操作來執行。

在你的榜樣,你可以肯定的是rowKeyColumn1Column2)或rowKey2Column1)的持續存在,但不可能兼顧。

您可以啓用分包的切換寫,這會增加概率,即寫會隨時間傳播,但同樣,這不是ACID DB

+0

我們有一批原子現在突變自卡桑德拉1.2?這是否仍然成立? – Peter 2013-12-08 09:58:01