Todos os produtos
Search
Central de documentação

Tablestore:Contador atômico

Última atualização: Jul 03, 2026

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

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)
    }
}