强制 Cassandra 批处理按我的顺序执行 java
Force Cassandra batch to execute in my order java
我想如果我在 Cassandra 中执行批处理(使用 java 驱动程序),无论 update/insert/delete 放在哪里,它总是按照更新、插入、删除的顺序执行。
像下面的代码一样,在我 运行 它之后, table 是空的。
我如何强制 cassandra 执行我的命令?
PreparedStatement trybach = MyConnection
.getSession()
.prepare(
"BEGIN BATCH USING TIMESTAMP"
+ " INSERT INTO transaction_test.users(email,age,firstname,lastname) VALUES ('try',18,'fname','lname');"
+ " DELETE FROM transaction_test.users WHERE email ='try';"
+ " UPDATE transaction_test.users SET age= 13 WHERE email= 'try';"
+
"APPLY BATCH");
MyConnection.getSession().execute(trybach.bind());
Cassandra 中的批处理并不意味着执行批处理语句的任何特定顺序。事实上,所有语句都将使用相同的时间戳执行,就好像所有语句都在同一时间并发执行一样。在您的示例中,删除语句将对 inserts/updates 有效,因为它只会使用与行创建时间相同的时间戳将行标记为已删除。
既然你在你的例子中提到了 "transaction" 并且似乎关心操作的顺序,我建议你看看你的用例 lightweight transactions。
我想如果我在 Cassandra 中执行批处理(使用 java 驱动程序),无论 update/insert/delete 放在哪里,它总是按照更新、插入、删除的顺序执行。 像下面的代码一样,在我 运行 它之后, table 是空的。 我如何强制 cassandra 执行我的命令?
PreparedStatement trybach = MyConnection
.getSession()
.prepare(
"BEGIN BATCH USING TIMESTAMP"
+ " INSERT INTO transaction_test.users(email,age,firstname,lastname) VALUES ('try',18,'fname','lname');"
+ " DELETE FROM transaction_test.users WHERE email ='try';"
+ " UPDATE transaction_test.users SET age= 13 WHERE email= 'try';"
+
"APPLY BATCH");
MyConnection.getSession().execute(trybach.bind());
Cassandra 中的批处理并不意味着执行批处理语句的任何特定顺序。事实上,所有语句都将使用相同的时间戳执行,就好像所有语句都在同一时间并发执行一样。在您的示例中,删除语句将对 inserts/updates 有效,因为它只会使用与行创建时间相同的时间戳将行标记为已删除。
既然你在你的例子中提到了 "transaction" 并且似乎关心操作的顺序,我建议你看看你的用例 lightweight transactions。