オンラインアプリケーションでカウンターを使用する場合、アトミックカウンター機能を使用できます。この機能を使用するには、列をアトミックカウンターとして指定し、その列に対してアトミックカウンター操作を実行します。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。
使用上の注意
アトミックカウンターは、INTEGER 型の列にのみ実装できます。
アトミックカウンターとして指定された列がデータの書き込み前に存在しない場合、列のデフォルト値は 0 になります。アトミックカウンターとして指定された列が INTEGER 型ではない場合、OTSParameterInvalid エラーが発生します。
アトミックカウンターは、正または負の数を使用して更新できますが、整数オーバーフローは避ける必要があります。整数オーバーフローが発生した場合、OTSParameterInvalid エラーが返されます。
デフォルトでは、アトミックカウンターの値は、行の更新リクエストへの応答では返されません。アトミックカウンターの更新された値を返すように指定できます。
1 つの更新リクエストで、列をアトミックカウンターとして指定し、その列を更新することはできません。たとえば、列 A をアトミックカウンターとして設定した場合、同じリクエストで上書きや削除などの他の操作をその列に対して実行することはできません。
BatchWriteRow リクエストを送信することで、同じ行に対して複数の更新操作を実行できます。ただし、行に対してアトミックカウンター操作を実行する場合、BatchWriteRow リクエストでは、その行に対して 1 つの更新操作のみ実行できます。
アトミックカウンターの最新バージョンの値のみを更新できます。指定したバージョンのアトミックカウンターの値を更新することはできません。更新操作が完了すると、新しいバージョンのデータが行のアトミックカウンターに挿入されます。
API 操作
アトミックカウンター機能を使用するために呼び出すことができる API 操作は、updateRowChange クラスに追加されています。次の表に、操作を示します。
操作 | 説明 |
IncrementColumn(columnName string, value int64) | 列の値を指定した数値だけ増減します。 |
AppendIncrementColumnToReturn(name string) | アトミックカウンターを実装するために操作が実行される列のうち、値を返したい列の名前を指定します。 |
SetReturnIncrementValue() | アトミックカウンターの値を返すためのデータ型を指定します。 |
パラメーター
パラメーター | 必須 | 説明 |
TableName | はい | データテーブルの名前。 |
ColumnName | はい | アトミックカウンター操作を実行する列の名前。INTEGER 型の列のみ指定できます。 |
Value | はい | 列の値の増分または減分。 |
例
次のサンプルコードは、データの書き込み時に updateRowChange 操作を呼び出して INTEGER 型の列の値を増やす方法と、列の新しい値を読み取る方法の例を示しています。
func UpdateRowWithIncrement(client *tablestore.TableStoreClient, tableName string) {
fmt.Println("begin to update row") // 行の更新を開始
updateRowRequest := new(tablestore.UpdateRowRequest)
updateRowChange := new(tablestore.UpdateRowChange)
// Specify the name of the data table. // データテーブルの名前を指定します。
updateRowChange.TableName = tableName
updatePk := new(tablestore.PrimaryKey)
updatePk.AddPrimaryKeyColumn("pk1", "pk1increment")
updatePk.AddPrimaryKeyColumn("pk2", int64(2))
updatePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
updateRowChange.PrimaryKey = updatePk
// Specify that the value of the col2 column on which operations are performed to implement atomic counter is increased by 30. Do not specify timestamps. // アトミックカウンターを実装するために操作が実行される col2 列の値を 30 増やすように指定します。タイムスタンプは指定しません。
updateRowChange.IncrementColumn("col2", int64(30))
// Return the values of the column on which operations are performed to implement atomic counter. // アトミックカウンターを実装するために操作が実行される列の値を返します。
updateRowChange.SetReturnIncrementValue()
updateRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
updateRowChange.AppendIncrementColumnToReturn("col2")
updateRowRequest.UpdateRowChange = updateRowChange
resp, err := client.UpdateRow(updateRowRequest)
if err != nil {
fmt.Println("update failed with error:", err) // 更新がエラーで失敗しました:
return
} else {
fmt.Println("update row finished") // 行の更新が完了しました
fmt.Println(len(resp.Columns))
fmt.Println(resp.Columns[0].ColumnName)
fmt.Println(resp.Columns[0].Value)
fmt.Println(resp.Columns[0].Timestamp)
}
}