Todos os produtos
Search
Central de documentação

Tablestore:Usar o recurso de transação local

Última atualização: Jun 23, 2026

Após ativar o recurso de transação local para uma tabela de dados, você pode criar uma transação local com base no valor de chave de partição especificado e executar operações de leitura e gravação nos dados da transação local. O recurso de transação local permite realizar operações atômicas de leitura e gravação em uma ou mais linhas.

Pré-requisitos

Usar o recurso de transação local

  1. Use start_local_transaction para criar uma transação local com base no valor de chave de partição especificado e obter o ID da transação local.

  2. Leia e grave dados na transação local.

    Você pode chamar as operações GetRow, PutRow, DeleteRow, UpdateRow, BatchWriteRow e GetRange para executar operações nos dados da transação local.

  3. Use commit_transaction para confirmar a transação local ou abort_transaction para descartar a transação local.

Notas de uso

  • O recurso de coluna de chave primária com incremento automático e o recurso de transação local não podem ser usados ao mesmo tempo.

  • O bloqueio pessimista é usado para controlar operações concorrentes em uma transação local.

  • O período de validade de uma transação local pode ser de até 60 segundos.

    Se uma transação local não for confirmada ou cancelada em 60 segundos, o servidor do Tablestore determina que a transação local expirou e a cancela.

  • Uma transação pode ser criada no servidor do Tablestore mesmo quando um erro de tempo limite é retornado. Nesse caso, você pode reenviar uma solicitação de criação de transação após a transação criada expirar.

  • Se uma transação local não for confirmada, ela pode se tornar inválida. Nesse caso, tente novamente as operações nessa transação.

  • Se nenhuma operação de gravação for realizada nos dados de uma transação local, as operações de confirmação e cancelamento terão o mesmo efeito.

  • O Tablestore impõe os seguintes limites às operações de leitura e gravação nos dados de uma transação local:

    • O ID da transação local não pode ser usado para acessar dados além do intervalo especificado com base no valor de chave de partição usado para criar a transação.

    • Os valores de chave de partição de todas as solicitações de gravação na mesma transação devem ser iguais ao valor de chave de partição usado para criar a transação. Esse limite não se aplica a solicitações de leitura.

    • Uma transação local pode ser usada por apenas uma solicitação por vez. Quando a transação local está em uso, outras operações que utilizam o mesmo ID de transação local falham.

    • O intervalo máximo entre duas operações consecutivas de leitura ou gravação nos dados de uma transação local é de 60 segundos.

      Se nenhuma operação de leitura ou gravação for realizada nos dados de uma transação local por mais de 60 segundos, o servidor do Tablestore determina que a transação expirou e a cancela.

    • Até 4 MB de dados podem ser gravados em cada transação. O volume de dados gravados em cada transação é calculado da mesma forma que uma solicitação de gravação regular.

    • Se você não especificar um número de versão para uma célula, o servidor do Tablestore atribuirá automaticamente um número de versão à célula da maneira usual quando a célula for gravada na transação, e não quando a transação for confirmada.

    • Se uma solicitação BatchWriteRow incluir um ID de transação local, todas as linhas na solicitação poderão ser gravadas apenas na tabela que corresponde ao ID da transação local.

    • Ao usar uma transação local, um bloqueio de gravação é adicionado aos dados do valor de chave de partição com base no qual a transação local foi criada. Apenas solicitações de gravação que contêm o ID da transação local e são iniciadas para gravar dados na transação local podem ser bem-sucedidas. Outras solicitações não transacionais ou solicitações de gravação que contêm IDs de outras transações locais e são iniciadas para gravar dados na transação local falharão. Os dados na transação local são desbloqueados quando a transação é confirmada, cancelada ou quando expira.

    • Uma transação local permanece válida mesmo que uma solicitação de leitura ou gravação com o ID da transação local seja rejeitada. Especifique uma regra de nova tentativa para reenviar a solicitação ou cancele a transação.

Como verificar se as transações locais estão ativadas para uma tabela de dados?

O console do Tablestore não exibe o status de transação local de uma tabela de dados. O comando desc do CLI exporta o esquema da tabela, mas não inclui o atributo de transação local.

Para confirmar se as transações locais estão ativadas para uma tabela de dados, use um SDK para chamar a operação DescribeTable. A resposta inclui os metadados completos da tabela, incluindo o status de transação local.

Se você não tiver acesso à operação DescribeTable, verifique se setLocalTxnEnabled(true) foi chamado no código usado para criar a tabela de dados ou envie um ticket para confirmar se esse recurso foi ativado anteriormente.

Parâmetros

Parâmetro

Descrição

table_name

O nome da tabela de dados.

key

A chave de partição da tabela de dados.

Especifique um valor de chave de partição ao criar uma transação local.

primary_key

A chave primária da tabela de dados.

Especifique os valores de todas as colunas de chave primária ao ler e gravar dados em uma transação local.

transaction_id

O ID da transação local que identifica exclusivamente uma transação local.

Especifique um ID de transação local ao ler e gravar dados em uma transação local.

Exemplos

Usar o recurso de transação local para gravar uma linha de dados

O código de exemplo a seguir mostra como criar uma transação local com base no valor de chave de partição especificado em uma tabela e gravar uma linha de dados na transação local. Se uma linha de dados for gravada na transação local, confirme a transação. Caso contrário, descarte a transação.

def  transaction_put_row(client):
    # Specify the name of the data table. 
    table_name = '<TABLE_NAME>'
    # Create a local transaction based on the partition key PK0. 
    key = [('PK0', 1)]
    # The returned value of the start_local_transaction method is the transaction ID. 
    transaction_id = client.start_local_transaction(table_name, key)

    # Write data. 
    primary_key = [('PK0', 1), ('PK1', 'transaction')]
    attribute_columns = [('value', 'origion value')]
    row = Row(primary_key, attribute_columns)
    condition = Condition(RowExistenceExpectation.IGNORE)
    try:
        # If you do not specify the ReturnType parameter when you call the put_row method, the value of the return_row parameter is None. 
        consumed, return_row = client.put_row(table_name, row, condition, None, transaction_id)
        # Display the number of write CUs that are consumed by the request. 
        print('put row succeed, consume %s write cu.' % consumed.write)
        # If a row of data is written in the local transaction, commit the local transaction. In this case, all data modifications in the local transaction take effect. You can discard a local transaction to invalidate all data modifications in the local transaction. 
        client.commit_transaction(transaction_id)
    # In most cases, client exceptions are caused by parameter errors or network exceptions. 
    except OTSClientError as e:
        print("put row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message()))
        # If a row of data fails to be written in the local transaction, discard the local transaction. In this case, all data modifications in the local transaction do not take effect on the data in the data table. 
        client.abort_transaction(transaction_id)
    # In most cases, server exceptions are caused by parameter or throttling errors. 
    except OTSServiceError as e:
        print("put row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id())) 
        # If a row of data fails to be written in the local transaction, discard the local transaction. In this case, all data modifications in the local transaction do not take effect on the data in the data table. 
        client.abort_transaction(transaction_id)

Usar o recurso de transação local para ler uma linha de dados

O código de exemplo a seguir mostra como criar uma transação local com base no valor de chave de partição especificado em uma tabela e ler uma linha de dados na transação local:

def transaction_get_row(client):
    # Specify the name of the data table. 
    table_name ='<TABLE_NAME>'
    # Create a local transaction based on the partition key PK0. 
    key = [('PK0', 1)]
    # The returned value of the start_local_transaction method is the transaction ID. 
    transaction_id = client.start_local_transaction(table_name, key)
    
    # Read data. 
    primary_key = [('PK0', 1), ('PK1', 'transaction')]
    columns_to_get = ['value']
    consumed, return_row, next_token = client.get_row(
        table_name, primary_key, columns_to_get, None, 1, None, None, None, None, transaction_id
    )
    for att in return_row.attribute_columns:
        print ('\tname:%s\tvalue:%s' % (att[0], att[1]))

    Commit or discard the local transaction. The effect on a read operation when you commit or discard a local transaction is the same. 
    # Commit the local transaction to allow all data modifications in the local transaction to take effect. 
    client.commit_transaction(transaction_id)
    # Discard the local transaction. In this case, all data modifications in the local transaction do not take effect on the data in the data table. 
    #client.abort_transaction(transaction_id)

Referências

Para gravar várias linhas de dados ao mesmo tempo ou ler dados cujos valores de chave primária estão dentro de um intervalo específico, crie uma transação local. Em seguida, consulte o código de exemplo fornecido no tópico Gravar dados ou Ler dados para iniciar uma solicitação que inclui o ID da transação local.