除了LWT以外,CASSANDRA/SCYALLA,也提供了另一個武器,batch(批次處理)
。
內容可以涵蓋select
、update
和delete
。
跟RDBMS的transaction有點相像,但不一樣。
batch可以保證執行內容的原子性
,結果不是全部成功,就是全部失敗,中途失敗並不用像RDBMS那樣自己再另外寫rollback做處理。
用法如以下範例,BEGIN BATCH
開始,以APPLY BATCH
結尾,中間範圍是要執行批次處理的語法。
BEGIN BATCH
INSERT INTO users (userid, password, name) VALUES ('user2', 'ch@ngem3b', 'second user');
UPDATE users SET password = 'ps22dhds' WHERE userid = 'user3';
INSERT INTO users (userid, password) VALUES ('user4', 'ch@ngem3c');
DELETE name FROM users WHERE userid = 'user1';
APPLY BATCH;
batch 的使用效能與執行的語法內容有很大關係。
如果內容是對單一個partition key操作,那麼效能可以在很好的預期範圍之內。
如果內容是需要處理多個partition,效能和花費時間會額外花費比較多時間。
不過正因為LWT的用法,其實只能在同一個partition key上面做操作(就一句語法後面加IF),有需要跨partition做原子性的修改,就可以使用batch,這個也是提供batch方法的原因之一。
其實batch裡面也可以放LWT的語法,不過限制於內容都要在同樣一個partition key做操作。
另外補充一點,相同一個的partition key操作,會保證在一次性執行完畢。
對於不同partition操作,並沒有保證,所以可能某些內容因此在批次操作全部執行完之前,資料就被讀取。