Java Cassandra中的顺序批处理查询

Java Cassandra中的顺序批处理查询,java,cassandra,sequential,batch-query,Java,Cassandra,Sequential,Batch Query,我有两个查询,我希望作为一个批处理来执行,以保持原子性。第一个查询是delete查询,第二个查询是insert查询,它们都在同一个表上操作。虽然确保原子性对我来说很重要,但维护查询的顺序也很重要(因为如果两个查询同时执行并且顺序混乱,我不想删除最近插入的行)。因此,我使用使用TIMESTAMP关键字来定义客户机提供的时间戳,以实现特定的顺序 我的问题是,当我尝试使用时间戳执行包含的批处理查询以提供执行顺序时,我的一些测试失败,而另一些测试通过。另一方面,当我完全删除batch语句并尝试按顺序执行

我有两个查询,我希望作为一个批处理来执行,以保持原子性。第一个查询是delete查询,第二个查询是insert查询,它们都在同一个表上操作。虽然确保原子性对我来说很重要,但维护查询的顺序也很重要(因为如果两个查询同时执行并且顺序混乱,我不想删除最近插入的行)。因此,我使用
使用TIMESTAMP
关键字来定义客户机提供的时间戳,以实现特定的顺序

我的问题是,当我尝试使用时间戳执行包含
的批处理查询以提供执行顺序时,我的一些测试失败,而另一些测试通过。另一方面,当我完全删除batch语句并尝试按顺序执行这两个查询时,它们都通过了。因此,我认为即使在使用
时间戳
值之后,也不会保持严格的查询执行顺序

我尝试用Java执行查询有两种方法

路#1

路#2


两次执行的输出相同。当我执行这两个查询时,相同的测试失败,因为它们在表中找不到预期的数据(而使用相同方法的其他测试通过)。我想知道是否有一种方法可以在执行批处理查询时实现严格的顺序性,如果这是唯一可以确保这一点的方法,那么在执行过程中是否有我可能缺少的内容。

据我所知,您希望删除而不是插入具有相同主键的行。如果我的理解是好的,您不需要在插入行之前删除它,因为Cassandra将insert管理为upsert(如果主键已经存在,则插入或更新)。@FabienMIFSUD很抱歉,这对我不起作用,因为表中有大量列。因此,当我删除时,它会删除特定ecid的所有列的条目,使用insert,我现在只为少数列添加值。好的,在这种情况下,您可以强制insert值中的所有值为null。小心,它会添加很多墓碑。但是为什么在这种情况下,像这样的批处理不起作用,而在没有批处理的情况下它却起作用呢?您使用哪种一致性级别?尝试将其强制为本地仲裁,以强制Cassandra尽可能保持一致。据我所知,您希望删除而不是插入具有相同主键的行。如果我的理解是好的,您不需要在插入行之前删除它,因为Cassandra将insert管理为upsert(如果主键已经存在,则插入或更新)。@FabienMIFSUD很抱歉,这对我不起作用,因为表中有大量列。因此,当我删除时,它会删除特定ecid的所有列的条目,使用insert,我现在只为少数列添加值。好的,在这种情况下,您可以强制insert值中的所有值为null。小心,它会添加很多墓碑。但是为什么在这种情况下,像这样的批处理不起作用,而在没有批处理的情况下它却起作用呢?您使用哪种一致性级别?尝试将其强制为本地仲裁,以强制Cassandra尽可能做到最一致。
final Session cassandraSession = CassandraSessionManager.getSession();
Batch batch = QueryBuilder.batch();

Delete.Where delete = QueryBuilder.delete().from(CassandraMetadata.KeySpace,CassandraMetadata.Tables.AUTHOPDATA.toString())
                     .using(timestamp(System.nanoTime()))
                     .where(QueryBuilder.eq(CassandraMetadata.AuthOpDataColumns.ECID.toString(), ecId));
batch.add(delete);

Insert insertAuthOp = QueryBuilder.insertInto(CassandraMetadata.KeySpace, CassandraMetadata.Tables.AUTHOPDATA.toString())
                    .using(timestamp(System.nanoTime()))
                    .value(CassandraMetadata.AuthOpDataColumns.ECID.toString(), ecId)
                    .value(CassandraMetadata.AuthOpDataColumns.OPERATION.toString(), operation)
                    .value(CassandraMetadata.AuthOpDataColumns.STATUS.toString(), status);

batch.add(insertAuthOp);
batch.setConsistencyLevel(DbProps.CassandraWriteConsistencyLevel.getValue());
cassandraSession.execute(batch);
final Session cassandraSession = CassandraSessionManager.getSession();
Batch batch = QueryBuilder.batch();

Delete.Where delete = QueryBuilder.delete().from(CassandraMetadata.KeySpace,CassandraMetadata.Tables.AUTHOPDATA.toString())
                     .using(timestamp(1L))
                     .where(QueryBuilder.eq(CassandraMetadata.AuthOpDataColumns.ECID.toString(), ecId));
batch.add(delete);

Insert insertAuthOp = QueryBuilder.insertInto(CassandraMetadata.KeySpace, CassandraMetadata.Tables.AUTHOPDATA.toString())
                    .using(timestamp(2L))
                    .value(CassandraMetadata.AuthOpDataColumns.ECID.toString(), ecId)
                    .value(CassandraMetadata.AuthOpDataColumns.OPERATION.toString(), operation)
                    .value(CassandraMetadata.AuthOpDataColumns.STATUS.toString(), status);

batch.add(insertAuthOp);
batch.setConsistencyLevel(DbProps.CassandraWriteConsistencyLevel.getValue());
cassandraSession.execute(batch);