Utilice la función de contador atómico para incrementar o decrementar una columna INTEGER en una sola operación segura para hilos, sin necesidad de un ciclo de lectura-modificación-escritura.
Requisitos previos
Se inicializó una instancia de OTSClient. Para obtener más información, consulte Initialize an OTSClient instance.
Se creó una tabla de datos y se escribieron datos en ella. Para obtener más información, consulte Create data tables y Write data.
Notas de uso
Los contadores atómicos solo se pueden implementar en columnas INTEGER.
Si una columna especificada como contador atómico no existe antes de escribir los datos, su valor predeterminado es 0. Si la columna designada como contador atómico no es de tipo INTEGER, se produce un error OTSParameterInvalid.
Es posible actualizar un contador atómico mediante un número positivo o negativo, pero debe evitarse el desbordamiento de enteros. Si ocurre este desbordamiento, se devuelve un error OTSParameterInvalid.
De forma predeterminada, el valor del contador atómico no se incluye en la respuesta a una solicitud de actualización de fila. No obstante, puede especificar que se devuelva el valor actualizado del contador.
No se permite especificar una columna como contador atómico y modificarla en la misma solicitud de actualización. Por ejemplo, si configura la Columna A como contador atómico, no podrá ejecutar simultáneamente otras operaciones sobre ella, como sobrescritura o eliminación.
Mediante una solicitud BatchWriteRow se pueden realizar varias operaciones de actualización en la misma fila. Sin embargo, al aplicar una operación de contador atómico, solo se admite una única operación de actualización por fila dentro de dicha solicitud.
Únicamente se puede modificar el valor de la versión más reciente de un contador atómico; no es posible actualizar una versión específica. Al completar la operación, se inserta automáticamente una nueva versión de datos en el contador atómico de la fila.
Operaciones de API
Las operaciones de contador atómico se exponen a través de la clase RowUpdateChange.
|
Operación |
Descripción |
|
RowUpdateChange Increment(Column) |
Incrementa o decrementa el valor de una columna INTEGER según la cantidad especificada. |
|
List<String> ReturnColumnNames |
Define qué columnas se devolverán tras la operación del contador atómico. |
|
ReturnType |
Establece el tipo de retorno para el resultado del contador atómico. |
Parámetros
|
Parámetro |
Descripción |
|
TableName |
Nombre de la tabla de datos. |
|
ColumnName |
Columna donde se aplicará la operación de contador atómico. Solo se admiten columnas INTEGER. |
|
Value |
Cantidad que se sumará o restará al valor de la columna. Utilice un número negativo para decrementar. |
|
ReturnColumnNames |
Columnas que se incluirán en la respuesta después de la operación. |
|
ReturnType |
Establezca este parámetro en |
Ejemplo
El siguiente ejemplo incrementa una columna INTEGER y devuelve el valor actualizado.
public static void Increment(int incrementValue)
{
Console.WriteLine("Start set increment column...");
OTSClient otsClient = Config.GetClient();
// Specify the primary key of the row. The primary key must be consistent with the primary key specified in TableMeta when you create the table.
PrimaryKey primaryKey = new PrimaryKey
{
{ Pk1, new ColumnValue(0) },
{ Pk2, new ColumnValue("abc") }
};
RowUpdateChange rowUpdateChange = new RowUpdateChange(TableName, primaryKey); // Specify the name of the data table.
// Set the ReturnType parameter to ReturnType.RT_AFTER_MODIFY to return the values of the column on which atomic counter operations are performed.
rowUpdateChange.ReturnType = ReturnType.RT_AFTER_MODIFY;
rowUpdateChange.ReturnColumnNames = new List<string>() { IncrementCol};
// Specify the column on which atomic counter operations are performed. The column value starts from 0 and increases by the number specified by the incrementValue parameter.
rowUpdateChange.Increment(new Column(IncrementCol, new ColumnValue(incrementValue)));
UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
var response = otsClient.UpdateRow(updateRowRequest);
Console.WriteLine("set Increment column succeed Increment result:" + response.Row.GetColumns()[0].Value);
}