1

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

我的问题是,当我尝试执行包含USING TIMESTAMP提供执行顺序的批处理查询时,我的一些测试失败了,而其他测试通过了。另一方面,当我完全删除批处理语句并尝试顺序执行两个查询时,它们都通过了。因此,我相信即使在使用该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);

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

4

0 回答 0