Java SDK 对整型列执行行级原子的递增或递减操作,单次请求可在更新后返回新值,适用于在线应用快速计数(如帖子 PV、消息计数、特定列加一等)的场景。
前提条件
安装 Tablestore Java SDK并初始化客户端。
功能说明
// RowUpdateChange 提供以下方法完成原子计数操作
public RowUpdateChange increment(Column column)
public void addReturnColumn(String columnName)
public void setReturnType(ReturnType returnType)通过以下三个方法在 RowUpdateChange 上完成原子计数操作:
increment(Column):对指定整型列执行原子的递增或递减操作(正数递增,负数递减)。addReturnColumn(String):指定需要在响应中返回更新后列值的列名。setReturnType(ReturnType):设置返回类型为ReturnType.RT_AFTER_MODIFY时返回原子计数列的更新后值。
服务端在行级别对指定列保证原子性,更新完成后插入一个新的数据版本。
以下示例对数据表 counter_demo 中主键 pk0 的行执行 price 列递增 10 操作,并在同一请求中读取更新后的值。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("pk0"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("counter_demo", primaryKey);
// 对 price 列执行递增操作,加 10(负数表示递减)
rowUpdateChange.increment(new Column("price", ColumnValue.fromLong(10)));
// 同一请求中返回更新后的列值
rowUpdateChange.addReturnColumn("price");
rowUpdateChange.setReturnType(ReturnType.RT_AFTER_MODIFY);
UpdateRowResponse response = client.updateRow(new UpdateRowRequest(rowUpdateChange));
Row row = response.getRow();
System.out.println("RequestId: " + response.getRequestId());
System.out.println("Updated price: " + row.getLatestColumn("price").getValue().asLong());参数说明
名称 | 类型 | 说明 |
tableName(必选) | String | 数据表名称。 |
columnName(必选) | String | 执行原子计数操作的列名。只支持整型列;列不存在时自动创建并初始化为本次增量值。 |
value(必选) | long | 列值的变更量。正数递增,负数递减。 运算结果不能溢出,否则返回 |
returnType(可选) | ReturnType | 响应返回类型。默认不返回更新后的列值。 设置为 |
使用限制
只支持对整型列执行原子计数;列不存在时默认值为 0,列已存在但非整型则返回
OTSParameterInvalid错误。增量可正可负,但不能出现计算溢出,溢出时返回
OTSParameterInvalid错误。原子计数操作只作用于最新版本,不支持指定时间戳;更新后插入一个新的数据版本。
单次更新请求中,对同一列不能同时执行原子计数和其他操作(如覆盖写、删除等)。
BatchWriteRow请求中,已执行原子计数的行只能在批次中出现一次。
原子计数操作可能因网络超时、系统错误等失败,重试时可能更新两次原子计数器,导致计数偏多或偏少。此类异常场景建议使用条件更新精确变更列值。