2017-03-02 82 views
0

Cassandra確實支持upsert,即如果update語句中提供的鍵不存在於表中;它暗示爲插入。有沒有辦法從更新查詢的返回碼中知道更新是否導致更新或插入。我們希望在沒有從Cassandra額外閱讀的情況下檢測到這一點。更新是否導致UPDATE或INSERT

我們有一個場景,我們有一個非常高的吞吐量應用程序,其中99%的事件導致插入,但一個非常小的塊導致更新。一旦更新,我們會想要執行一些額外的檢查並觸發一些。

回答

0

簡答:所有Cassandra寫入的都是upserts,它們不會在寫入之前檢查數據庫的狀態。

更長的回答:知道是否設置了值需要從卡桑德拉讀取,這意味着如果你想知道當你upsert時是否存在某件事意味着你最終必須在寫作之前做反讀模式。

基本上所有需要這種有狀態信息的數據模型都需要性能懲罰。你最好的選擇是找出構造代碼的另一種方法。如果你真的需要知道差異,你可以嘗試Paxos支持,如果不存在風格的請求,但知道他們也有成本。

+0

我們想不管更新或插入。我只是試圖找出更新語句執行後知道的方式,如果它導致更新或插入。 – Sunil

+0

你無法知道 – RussS

2

您可以在更新語句結束時添加IF EXITS

所以更新語句將是:

UPDATE person SET name = 'xxxxx' WHERE id = '16843158' IF exists;

人,ID是列名。

如果行退出,則返回True,否則返回False。使用這個,你可以創建一個支票,然後「執行一些額外的檢查並觸發一些」。如果行不退出,這也不會插入任何東西。

請檢查true/false是否作爲行的列或作爲布爾值返回,因爲我僅在cqlsh中檢查了它。

談論Java。在cqlsh中,它顯示爲列輸出。

+0

我認爲如果卡桑德拉有點與此相反會幫助我們。正如我在本例中所說的,有99%的傳入記錄會導致插入。和1%更新。我們希望讓兩者都能做到這一點;更新或插入。但是我只想在upsert執行後知道實際發生了什麼;更新或插入。 – Sunil

+0

好的!我明白你到底想要什麼。我懷疑,你想要什麼在卡桑德拉本身的水平上存在。您可能必須在您的應用程序級別具有此功能。通過使用上述查詢,您可以確定更新是否成功或需要插入它(請參閱單詞)。在普通的upsert執行之後似乎沒有任何方法來決定「實際發生了什麼;更新或插入」。 – r005t3r