我是Cassandra的新手,我读过Cassandra鼓励非规范化和重复数据.这让我有点困惑.让我们想象以下场景:
我有一个包含四个表的键空间:A,B,C和D.
CREATE TABLE A ( tableID int, column1 int, column2 varchar, column3 varchar, column4 varchar, column5 varchar, PRIMARY KEY (column1, tableID) );
让我们假设其他表(B,C,D)具有与表A相同的结构和相同的数据,只有不同的主键,以便响应其他查询.
如果我升级表A中的一行,我如何确保具有相同数据的其他表中的数据的一致性?
卡桑德拉提供BATCH
了这个目的.从文档:
BATCH语句将多个数据修改语言(DML)语句(INSERT,UPDATE,DELETE)组合到单个逻辑操作中,并为批处理中的语句写入的所有列设置客户端提供的时间戳.批处理多个语句可以节省客户端/服务器和服务器协调器/副本之间的网络交换.但是,由于Cassandra的分布式特性,尽可能地在附近节点上传播请求以优化性能.使用批次来优化性能通常不会成功,如使用和滥用批次部分中所述.有关加载数据的最快方法的信息,请参阅"Cassandra:没有Batch关键字的批量加载".
批量默认为原子.在Cassandra批处理操作的上下文中,atomic表示如果任何批处理成功,则所有批处理都将成功.为了实现原子性,Cassandra首先将序列化批处理写入批处理系统表,该表使用序列化批处理作为blob数据.成功编写并保留(或提示)批处理中的行后,将删除批处理日志数据.原子性会降低性能.如果您不想承担此罚款,请阻止Cassandra使用UNLOGGED选项写入批处理日志系统:BEGIN UNLOGGED BATCH
UNLOGGED BATCH几乎总是不受欢迎的,我相信在未来的版本中会被删除.正常批次提供您想要的功能.