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請求中,已執行原子計數的行只能在批次中出現一次。
原子計數操作可能因網路逾時、系統錯誤等失敗,重試時可能更新兩次原子計數器,導致計數偏多或偏少。此類異常情境建議使用條件更新精確變更列值。