如果我使用CQL使用Cassandra批处理语句,则每个语句都可以有一个单独的时间戳。例如,像:
BEGIN BATCH
INSERT INTO users (name, surname) VALUES ('Bob', 'Smith') USING TIMESTAMP 10000001;
DELETE FROM users USING TIMESTAMP 10000000 WHERE user='Bob';
APPLY BATCH;
如果我尝试使用C ++驱动程序做类似的事情,我会做这样的事情:
然后我希望它的行为方式与CQL批处理语句相同,只要批处理中的每个语句都使用自己独立的时间戳执行。但是,根据我的测试,我无法让它发挥作用。它似乎使用单个时间戳执行整个批处理。
同样,如果我创建一个单调时间戳生成器来为我生成时间戳,它似乎只是为批处理使用时间戳而不是单个语句。
我看了一下C ++驱动程序的源代码,它看起来像批处理中的语句编码发送到数据库(在ExecuteRequest :: encode_batch中),它不会尝试编码批处理中每个语句的时间戳,仅适用于批处理。当编码不是批处理的单个语句时,它会对语句的时间戳进行编码(在ExecuteRequest :: internal_encode中)。
作为一种解决方法,我可以将“USING TIMESTAMP 10000001”直接放入CQL字符串中,而不是使用cass_statement_set_timestamp在语句上设置时间戳,然后按预期工作。因此,似乎数据库可以在批处理中的每个语句上正确地具有单独的时间戳,但C ++驱动程序无法发送它们。
但是使用“USING TIMESTAMP 10000001”将时间戳直接放入CQL中,然后我就不能通过将新值绑定到它来重用该语句。我需要再次准备声明。
有没有其他人尝试过这个并设法让它发挥作用?或者它只是C ++驱动程序的已知限制?
我正在使用Cassandra C ++驱动程序版本2.2.2和数据库版本2.2.5,据我所知,它使用的是本机协议版本4
答案 0 :(得分:1)
我还在Cassandra C ++驱动程序邮件列表Google上提出了这个问题,Michael Penick回答说它目前无法实现。底层协议不支持批处理中每个语句的时间戳,因此驱动程序无法发送一个。