Se sua aplicação online precisar de um contador, use o recurso de contador atômico. Para isso, especifique uma coluna como contador atômico e execute operações de contador atômico nessa coluna.
Pré-requisitos
Instância OTSClient inicializada. Para mais informações, consulte Inicializar uma instância OTSClient.
Tabela de dados criada com dados gravados.
Observações de uso
Contadores atômicos são suportados apenas em colunas do tipo INTEGER.
Se a coluna definida como contador atômico não existir durante a gravação de dados, seu valor padrão será 0. Se a coluna especificada não for do tipo INTEGER, ocorrerá o erro OTSParameterInvalid.
Atualize o contador atômico com valores positivos ou negativos, mas evite estouro de inteiro. Em caso de estouro, o sistema retornará o erro OTSParameterInvalid.
Por padrão, a resposta à solicitação de atualização de linha não retorna o valor do contador atômico. Especifique o retorno do valor atualizado do contador atômico conforme necessário.
Não defina uma coluna como contador atômico e a atualize na mesma solicitação. Por exemplo, se você definir a Coluna A como contador atômico, não poderá executar outras operações, como sobrescrita e exclusão, nessa coluna simultaneamente.
Envie uma solicitação BatchWriteRow para realizar múltiplas operações de atualização na mesma linha. No entanto, ao executar uma operação de contador atômico em uma linha, realize apenas uma operação de atualização nessa linha por solicitação BatchWriteRow.
Atualize apenas o valor da versão mais recente do contador atômico. Não é possível atualizar o valor de uma versão específica. Após a conclusão da operação de atualização, uma nova versão dos dados é inserida no contador atômico da linha.
Operações de API
As operações de API para usar o recurso de contador atômico foram adicionadas à classe updateRowChange. A tabela a seguir descreve essas operações.
|
Operação |
Descrição |
|
IncrementColumn(columnName string, value int64) |
Aumenta ou diminui o valor de uma coluna por um número específico. |
|
AppendIncrementColumnToReturn(name string) |
Especifica o nome da coluna cujo valor deve ser retornado entre as colunas nas quais as operações de contador atômico são executadas. |
|
SetReturnIncrementValue() |
Especifica um tipo de dado para retornar o valor de um contador atômico. |
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
TableName |
Sim |
Nome da tabela de dados. |
|
ColumnName |
Sim |
Nome da coluna na qual executar operações de contador atômico. Especifique apenas colunas do tipo INTEGER. |
|
Value |
Sim |
Valor de incremento ou decremento na coluna. |
Exemplos
O código de exemplo a seguir mostra como chamar a operação updateRowChange para aumentar o valor de uma coluna do tipo INTEGER durante a gravação de dados e como ler os novos valores da coluna:
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.
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)
}
}