等待数据变更完成
ALTER TABLE mutation 返回时,数据变更可能还未完成。应用修改事件名称后立即查询,可能仍读到旧值。
操作示例
CREATE TABLE event_log (id String, event_name String)
ENGINE = MergeTree ORDER BY id;
INSERT INTO event_log VALUES ('E1', 'login');
jdbcTemplate.executeUpdate(
"ALTER TABLE event_log UPDATE event_name = ? WHERE id = ? SETTINGS mutations_sync = 0",
new Object[] { "archived", "E1" });
这里明确使用异步执行。调用成功说明命令已接受,不表示匹配的数据已经全部修改。
等待完成后再读取
如果下一步需要读取当前服务节点上的新值,在提交时使用 mutations_sync = 1:
jdbcTemplate.executeUpdate(
"ALTER TABLE event_log UPDATE event_name = ? WHERE id = ? SETTINGS mutations_sync = 1",
new Object[] { "archived", "E1" });
String name = jdbcTemplate.queryForObject(
"SELECT event_name FROM event_log WHERE id = ?",
new Object[] { "E1" }, String.class);
成功返回后,name 为 archived。此例使用单节点 MergeTree 表;副本等待设置见mutation 同步方式。
修改与删除的返回值
修改或删除成功,不代表 JDBC 返回值就是实际命中条数。例如,将上述条件改为 WHERE event_name = 'login',即使命中多条记录,也不能把 executeUpdate() 的返回值当作修改数量;返回值同样不能可靠判断是否没有匹配记录。
构造器 API 和 BaseMapper 也沿用驱动的返回值。需要确认数据是否改变时,应等待操作完成后查询目标记录;不要用 返回值 == 1 作为单条修改成功的业务判断。