Após ativar o recurso de transação local em uma tabela de dados, crie uma transação local com base em um valor de chave de partição específico para executar operações de leitura e gravação nos dados dessa transação. Esse recurso permite realizar operações atômicas de leitura e gravação em uma ou mais linhas.
Pré-requisitos
Cliente inicializado. Para mais informações, consulte Inicializar um cliente do Tablestore.
-
Tabela de dados criada com o recurso de transação local ativado.
NotaSe você não ativou o recurso de transação local ao criar a tabela de dados e deseja utilizá-lo posteriormente, envie um ticket.
Usar o recurso de transação local
Use startLocalTransaction para criar uma transação local com base no valor da chave de partição especificado e obter o ID da transação.
-
Leia e grave dados na transação local.
Chame as operações GetRow, PutRow, DeleteRow, UpdateRow, BatchWriteRow e GetRange para manipular os dados na transação local.
Use commitTransaction para confirmar a transação local ou abortTransaction para cancelá-la.
Observações de uso
Os recursos de coluna de chave primária com incremento automático e transação local não podem ser usados simultaneamente.
O bloqueio pessimista controla operações simultâneas em uma transação local.
-
A validade máxima de uma transação local é de 60 segundos.
Se a transação não for confirmada ou cancelada dentro desse período, o servidor do Tablestore considera que houve timeout e encerra a transação automaticamente.
Mesmo que ocorra um erro de timeout, a transação pode ter sido criada no servidor do Tablestore. Nessa situação, reenvie a solicitação de criação após o timeout da transação criada anteriormente.
Transações locais não confirmadas podem perder a validade. Caso isso ocorra, tente repetir as operações dessa transação.
Sem operações de gravação nos dados da transação local, as operações de confirmação e cancelamento produzem o mesmo efeito.
-
O Tablestore impõe os seguintes limites às operações de leitura e gravação em dados de uma transação local:
O ID da transação local não permite acessar dados fora do intervalo definido pelo valor da chave de partição usado na criação da transação.
Todas as solicitações de gravação na mesma transação devem usar o mesmo valor de chave de partição da criação da transação. Essa restrição não se aplica a solicitações de leitura.
Apenas uma solicitação pode usar a transação local por vez. Enquanto estiver em uso, outras operações com o mesmo ID de transação local falharão.
-
O intervalo máximo entre duas operações consecutivas de leitura ou gravação na transação local é de 60 segundos.
Se nenhuma operação de leitura ou gravação ocorrer por mais de 60 segundos, o servidor do Tablestore considerará que a transação expirou e a cancelará.
Cada transação aceita até 4 MB de dados gravados. O cálculo do volume de dados segue o mesmo método de uma solicitação de gravação comum.
Sem a especificação de um número de versão para uma célula, o servidor do Tablestore atribui automaticamente esse número no momento da gravação na transação, e não durante a confirmação.
Solicitações BatchWriteRow com ID de transação local só podem gravar linhas na tabela correspondente a esse ID.
Ao usar uma transação local, um bloqueio de gravação é aplicado aos dados do valor da chave de partição associado à transação. Somente solicitações de gravação contendo o ID correto da transação local serão bem-sucedidas. Outras solicitações não transacionais ou com IDs diferentes falharão. Os dados são desbloqueados quando a transação é confirmada, cancelada ou expira.
A transação local permanece válida mesmo se uma solicitação de leitura ou gravação com seu ID for rejeitada. Defina 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. O comando desc da 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, use um SDK para chamar a operação DescribeTable. A resposta contém os metadados completos da tabela, incluindo o status da transação local.
Sem acesso à operação DescribeTable, verifique se setLocalTxnEnabled(true) foi chamado no código de criação da tabela ou envie um ticket para confirmar a ativação prévia desse recurso.
Operações de API
Esta seção descreve as seguintes operações de API relacionadas ao recurso de transação local: startLocalTransaction, commitTransaction e abortTransaction.
startLocalTransaction
/**
* Create a local transaction and obtain the local transaction ID.
* @api
* @param [] $request
* The request parameters, including the table name and partition key.
* @return [] The response.
* @throws OTSClientException The exception that is returned when a parameter error occurs or the Tablestore server returns a verification error.
* @throws OTSServerException The exception that is returned when the Tablestore server returns an error.
* @example "src/examples/StartLocalTransaction.php" 50
*/
public function startLocalTransaction(array $request)
commitTransaction
/**
* Commit a local transaction.
* @api
*
* @param [] $request
* The request parameter, which is the transaction ID.
* @return [] The response.
* @throws OTSClientException The exception that is returned when a parameter error occurs or the Tablestore server returns a verification error.
* @throws OTSServerException The exception that is returned when the Tablestore server returns an error.
* @example "src/examples/CommitTransaction.php" 50
*/
public function commitTransaction(array $request)
abortTransaction
/**
* Abort a local transaction.
* @api
*
* @param [] $request
* The request parameter, which is the transaction ID.
* @return [] The response.
* @throws OTSClientException The exception that is returned if a parameter error occurs or the Tablestore server returns a verification error.
* @throws OTSServerException The exception that is returned if the Tablestore server returns an error.
* @example "src/examples/AbortTransaction.php" 20
*/
public function abortTransaction(array $request)
Parâmetros
|
Parâmetro |
Descrição |
|
table_name |
Nome da tabela de dados. |
|
key |
Chave de partição da tabela de dados. Especifique um valor de chave de partição ao criar uma transação local. |
|
primary_key |
Chave primária da tabela de dados. Defina os valores de todas as colunas da chave primária durante a leitura e gravação de dados em uma transação local. |
|
transaction_id |
ID que identifica exclusivamente a transação local. Informe o ID da transação local para ler e gravar dados dentro dela. |
Exemplos
Usar o recurso de transação local para gravar uma linha de dados
Neste exemplo, uma linha de dados é gravada em uma transação local criada para uma chave de partição específica de uma tabela e, em seguida, a transação é confirmada.
// Obtain the local transaction ID.
$response = $client->startLocalTransaction (array (
'table_name' => 'TransactionTable',
// The primary key is [PK0:INTEGER,PK1:STRING].
'key' => array(
array('PK0', 123)
)
));
$attr = array();
$attr[] = ['col0', 'bbb'];
$request = [
'table_name' => 'TransactionTable',
'condition' => RowExistenceExpectationConst::CONST_IGNORE, // You can set condition to IGNORE, EXPECT_EXIST, or EXPECT_NOT_EXIST.
// Specify the primary key.
'primary_key' => [
['PK0', 123],
['PK1', 'abc']
],
'attribute_columns' => $attr,
'transaction_id' => $response['transaction_id']
];
// Execute the putRow method to write data.
$client->putRow($request);
// Commit the transaction for all data modifications within the transaction to take effect. You can discard a local transaction to invalidate all data modifications in the local transaction.
$client->commitTransaction(array(
'transaction_id' => $response['transaction_id']
));
// Abort the local transaction to move all data modifications within the transaction out of effect.
// $client->abortTransaction(array(
// 'transaction_id' => $response['transaction_id']
// ));
Usar o recurso de transação local para ler uma linha de dados
Este exemplo demonstra a leitura de uma linha de dados em uma transação local criada para uma chave de partição específica de uma tabela.
// Obtain the local transaction ID.
$response = $client->startLocalTransaction (array (
'table_name' => 'TransactionTable',
// The primary key is [PK0:INTEGER,PK1:STRING].
'key' => array(
array('PK0', 123)
)
));
$request = array(
'table_name' => 'TransactionTable',
// Specify the primary key.
'primary_key' => array (
array('PK0', 123),
array('PK1', 'abc')
),
'max_versions' => 1,
'columns_to_get' => ['col0'],
'transaction_id' => $response['transaction_id']
);
// Execute the getRow method to read data.
$client->getRow($request);
// Commit or abort the local transaction. The effect on a read operation when you commit or discard a local transaction is the same.
// Commit the transaction for all data modifications within the transaction to take effect.
$client->commitTransaction(array(// Commit the transaction
'transaction_id' => $response['transaction_id']
));
// Abort the local transaction to move all data modifications within the transaction out of effect.
// $client->abortTransaction(array(
// 'transaction_id' => $response['transaction_id']
// ));
Referências
Para gravar várias linhas de dados simultaneamente ou ler dados cujos valores de chave primária estejam em 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 inclua o ID da transação local.