全部产品
Search
文档中心

表格存储:原子计数器

更新时间:Jun 25, 2026

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

列值的变更量。正数递增,负数递减。

运算结果不能溢出,否则返回 OTSParameterInvalid 错误。

returnType(可选)

ReturnType

响应返回类型。默认不返回更新后的列值。

设置为 ReturnType.RT_AFTER_MODIFY 并配合 addReturnColumn 时,响应中返回原子计数列的更新后值。

使用限制

  • 只支持对整型列执行原子计数;列不存在时默认值为 0,列已存在但非整型则返回 OTSParameterInvalid 错误。

  • 增量可正可负,但不能出现计算溢出,溢出时返回 OTSParameterInvalid 错误。

  • 原子计数操作只作用于最新版本,不支持指定时间戳;更新后插入一个新的数据版本。

  • 单次更新请求中,对同一列不能同时执行原子计数和其他操作(如覆盖写、删除等)。

  • BatchWriteRow 请求中,已执行原子计数的行只能在批次中出现一次。

重要

原子计数操作可能因网络超时、系统错误等失败,重试时可能更新两次原子计数器,导致计数偏多或偏少。此类异常场景建议使用条件更新精确变更列值。