考虑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是行键),因为行键是相同的?
答案 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开始,单个分区的所有批处理语句将作为单个更新操作执行。这将涉及行级隔离。