2014-01-15 60 views
9

我正在編寫一個應用程序,我需要能夠判斷插入和更新是否成功。我正在使用「INSERT ... IF NOT EXISTS」來獲取輕量級事務行爲,並注意到從execute返回的結果集包含一個包含更新數據的行和一個可以查詢的「[applied]」列。太棒了。但我有一個更新語句返回一個空的ResultSet。看起來好像更新成功了,但我想要一個編程方式來驗證。Cassandra Java驅動程序:如何報告插入,更新和刪除結果?

澄清:

我打開了我的突變返回的結果集的一些記錄。我發現「INSERT ... IF NOT EXIST」返回一個帶有名爲「[applied]」的布爾列的ResultSet。如果「[applied]」爲false,它也會返回已經退出的行。

隨着更新,我總是看到一個空的ResultSet。

所以我有兩個問題:

  1. 哪裏是什麼ResultSet中應包含每個突變類型的文檔?我沒有在CQL文檔或Java驅動程序文檔中看到它。我甚至試着查看其他語言集成的文檔,但沒有發現任何有關ResultSet內容突變的描述。
  2. 有什麼方法可以找出有多少行由UPDATE修改或由DELETE刪除?

回答

3

即使我陷入了同樣的問題。我發現的一件事情是,如果更新或插入失敗,結果集中的列定義不止一個,並且如果突變成功,列定義只包含一列,即「已應用」。問題是ResultSet不包含「已應用」列的值,如果突變成功,則爲「true」;如果事務阻止更改數據,則爲「false」。我現在在應用程序中使用這種黑客攻擊,但我認爲它不是一個好的解決方案,所以即使我在尋找更好的解決方案。

+0

是的,這不是真正的黑客,因爲它是Cassandra似乎要傳達突變結果的唯一方法。我正在做同樣的事情。我通過記錄結果集的內容來發現這一點,我期望這些結果集是空的。我希望文檔在這個行爲上更清楚。 – AlphaGeek

+1

即使你!?哇,這是一個嚴重的問題! – Maxim

+0

Cassandra文檔:INSERT將一個或多個列以原子方式孤立地寫入Cassandra表中的記錄。沒有結果返回。 – Maxim

3

在卡桑德拉插入/更新/刪除行爲相同,他們被稱爲突變。如果你的客戶沒有返回任何異常,那麼這個變異就完成了。

如果您擔心突變調用的一致性,請將USING CONSISTENCY添加到更高級別。

http://www.datastax.com/docs/1.0/references/cql/index http://www.datastax.com/docs/1.1/dml/data_consistency

如果你是後一致性好,我建議使用LOCAL_QUORUM用於讀取和突變。這樣,您不必擔心以編程方式檢查突變,因爲它需要隨後讀取。

+0

謝謝,這是有幫助的,但它沒有解決真正的問題。我已經添加了一些信息來幫助澄清我的問題。 – AlphaGeek

+0

當突變失敗時,cassandra會返回什麼? – Cody

1

有什麼方法可以找出有多少行由UPDATE修改或由DELETE刪除?

據我所知,沒有,因爲DELETE或UPDATE是最終一致。有可能是一致性級別爲ONE或LOCAL_ONE的INSERT沒有完全複製,並且在 INSERT完全複製之前在其他主機上完成了突變。突變仍然適用,但您無法知道有多少行實際受到影響。我使用,以確定是否INSERT工作或不

+1

是的,在過去的一年裏,我已經學到了更多關於最終一致性的含義。不過謝謝 – AlphaGeek

2

一種解決方法是檢查從ResultSet返回的行數據:

ResultSet rs = session.execute(bs); 
Row row = rs.one(); 
boolean insertFailed = row.getColumnDefinitions().contains("ownerid"); 

這裏,ownerid是主行鍵。您可以使用各自的列名稱。

相關問題