2014-05-22 101 views
1

我目前正在開發cassandra源代碼(2.0.4),我想知道如何使用類ColumnFamily中的方法isMarkedForDelete()。如果我用一個鍵插入一行,該方法返回false,如果我刪除該行,則返回true。這就是我期望的方式;-)但是,這就是我想知道的,如果我再次使用相同的鍵插入一行,該方法仍然返回false,儘管該行不會被刪除(因爲它是一個具有相同鍵的新行)。看起來,刪除並重新插入的行始終保持標誌,如果它在過去被刪除一次。我如何可靠地確定一行是否被刪除? 在此先感謝!檢查行是否被刪除

回答

6

刪除是卡桑德拉是通過寫一個新的行被稱爲墓碑來完成的。邏輯刪除將確保該行不會在任何查詢中返回(其中一個邏輯刪除已在所有節點上達到完全一致)。

該行實際上是從當以下的SSTables刪除滿意:

  1. 壓實發生
  2. 墓碑記錄比對錶gc_grace_seconds舊的(默認爲10天)

使用已存在的鍵插入行不會導致錯誤,因爲Cassandra中的數據結構的行爲非常像Java Map。使用相同的鍵「放入」一行只會覆蓋插入的列值,併成功。

確定行是否已被刪除的最佳方法是查詢行並確保查詢中未返回該行。

我不確定你正在使用哪個客戶端,但是使用C * 2.0,你應該使用DataStax Java Driver(當前版本爲2.0.2)。

+0

感謝您的回答!我理解墓碑的原則是爲了標記一行刪除,稍後在一個壓縮文件中完成。但是爲什麼在從SSTables實際刪除行之前,如果用相同的鍵重新插入行,邏輯刪除不會被刪除? – user3581199

+0

如果在刪除行之後再次插入該行,則該行鍵的邏輯刪除不再是該行鍵的最新「寫入」,因此此時邏輯刪除不相關。 –