cassandra中的java顺序批处理查询

3duebb1j  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(278)

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

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);

2路

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);

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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题