Cassandra的原子批次

时间:2015-06-01 11:53:50

标签: cassandra

考虑Cassandra中的以下批处理语句:

 BEGIN BATCH
 INSERT INTO users (userID, password, name) VALUES ('user2', 'ch@ngem3b', 'second user')

 UPDATE users SET password = 'ps22dhds' WHERE userID = 'user2'

 DELETE * FROM users WHERE userID = 'user2'
 INSERT INTO users (userID, password, name) VALUES ('user2', 'ch@ngem3c', 'Andrew')
 APPLY BATCH;

Cassandra批处理中的上述语句是否会确保行级隔离(userID是行键),因为行键是相同的?

2 个答案:

答案 0 :(得分:2)

需要注意的一件重要事情是,在没有为每个语句指定时间戳的批处理中,所有语句都将在同一时间戳执行。

这意味着你写的所有四个陈述

INSERT INTO users (userID, password, name) VALUES ('user2', 'ch@ngem3b', 'second user')

UPDATE users SET password = 'ps22dhds' WHERE userID = 'user2'

DELETE * FROM users WHERE userID = 'user2'

INSERT INTO users (userID, password, name) VALUES ('user2', 'ch@ngem3c', 'Andrew')

所有发生在同一时间,在这种情况下,使用通常修改的单元格的最高值。虽然应用了所有四个陈述,但结果很可能不是您所期望的。

基本上C *会看到

INSERT ('user2', 'ch@ngem3b', 'second user')
INSERT ('user2', 'ps22dhds', 'second user')
INSERT ('user2', 'Tombstone', 'Tombstone')
INSERT ('user2', 'ch@ngem3c', 'Andrew')

在这种情况下,因为它们都具有相同的时间戳C *通过选择单元格的最大值来解决冲突,你将最终得到(除非我在这里得到错误的字节顺序)

('user2', 'ps22dhds', 'second user')

相反,对于这种操作,请考虑在C *中使用Check And Set(CAS)操作。

http://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0

答案 1 :(得分:1)

从Cassandra 2.0.6开始,单个分区的所有批处理语句将作为单个更新操作执行。这将涉及行级隔离。