Después de habilitar la función de transacción local en una tabla de datos, puede crear una transacción local basada en un valor de clave de partición específico y ejecutar operaciones de lectura y escritura sobre los datos dentro de dicha transacción. Esta función le permite realizar operaciones atómicas para leer y escribir una o varias filas.
Requisitos previos
Un cliente inicializado. Para obtener más información, consulte Initialize a Tablestore client.
-
Una tabla de datos creada con la función de transacción local habilitada.
NotaSi no habilitó la función de transacción local al create a data table y desea utilizarla después de crear la tabla de datos, envíe un ticket.
Uso de la función de transacción local
Utilice startLocalTransaction para crear una transacción local basada en el valor de clave de partición especificado y obtenga el ID de la transacción local.
-
Lea y escriba datos en la transacción local.
Puede llamar a las operaciones GetRow, PutRow, DeleteRow, UpdateRow, BatchWriteRow y GetRange para realizar operaciones sobre los datos en la transacción local.
Utilice commitTransaction para confirmar la transacción local o abortTransaction para cancelarla.
Notas de uso
No es posible utilizar simultáneamente la función de columna de clave principal de incremento automático y la función de transacción local.
Se utiliza bloqueo pesimista para controlar las operaciones concurrentes en una transacción local.
-
El periodo de validez de una transacción local es de hasta 60 segundos.
Si una transacción local no se confirma ni se cancela dentro de los 60 segundos, el servidor de Tablestore determina que ha expirado y la cancela.
Es posible que se cree una transacción en el servidor de Tablestore incluso si se devuelve un error de tiempo de espera agotado. En este caso, puede reenviar una solicitud de creación de transacción una vez que la transacción creada haya expirado.
Si una transacción local no se confirma, podría volverse inválida. En tal situación, reintente las operaciones de esta transacción.
Si no se ejecuta ninguna operación de escritura sobre los datos de una transacción local, las operaciones de confirmación y cancelación tienen el mismo efecto.
-
Tablestore impone los siguientes límites en las operaciones de lectura y escritura sobre los datos de una transacción local:
El ID de transacción local no puede usarse para acceder a datos fuera del rango definido por el valor de clave de partición utilizado para crear la transacción.
Los valores de clave de partición de todas las solicitudes de escritura en la misma transacción deben coincidir con el valor de clave de partición usado para crearla. Este límite no aplica a las solicitudes de lectura.
Una transacción local solo puede ser utilizada por una solicitud a la vez. Mientras la transacción local esté en uso, otras operaciones que utilicen el mismo ID de transacción local fallarán.
-
El intervalo máximo entre dos operaciones consecutivas de lectura o escritura sobre los datos de una transacción local es de 60 segundos.
Si no se realiza ninguna operación de lectura o escritura sobre los datos de una transacción local durante más de 60 segundos, el servidor de Tablestore determina que la transacción ha expirado y la cancela.
Se pueden escribir hasta 4 MB de datos en cada transacción. El volumen de datos escritos en cada transacción se calcula de la misma manera que en una solicitud de escritura normal.
Si no especifica un número de versión para una celda, el servidor de Tablestore asigna automáticamente un número de versión a la celda de forma habitual cuando se escribe en la transacción, en lugar de hacerlo al confirmar la transacción.
Si una solicitud BatchWriteRow incluye un ID de transacción local, todas las filas de la solicitud solo pueden escribirse en la tabla que coincide con dicho ID de transacción local.
Al usar una transacción local, se añade un bloqueo de escritura a los datos del valor de clave de partición en el que se basa la transacción. Solo tendrán éxito las solicitudes de escritura que contengan el ID de transacción local y se inicien para escribir datos en dicha transacción. Otras solicitudes no transaccionales, o solicitudes de escritura que contengan IDs de otras transacciones locales e intenten escribir datos en la transacción local, fallarán. Los datos de la transacción local se desbloquean si la transacción se confirma, se cancela o expira.
Una transacción local permanece válida incluso si se rechaza una solicitud de lectura o escritura con su ID. Defina una regla de reintentos para reenviar la solicitud o cancele la transacción.
Operaciones de API
Esta sección describe las siguientes operaciones de API relacionadas con la función de transacción local: startLocalTransaction, commitTransaction y 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)
Ejemplos
Uso de la función de transacción local para escribir una fila de datos
En este ejemplo, se escribe una fila de datos en una transacción local creada para una clave de partición específica de una tabla y se confirma la transacción local.
// 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']
// ));
Uso de la función de transacción local para leer una fila de datos
En este ejemplo, se lee una fila de datos en una transacción local creada para una clave de partición específica de una tabla.
// 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']
// ));
Referencias
Si desea escribir varias filas de datos al mismo tiempo o leer datos cuyos valores de clave principal se encuentren dentro de un rango específico, cree una transacción local. A continuación, consulte el código de muestra proporcionado en el tema Write data o Read data para iniciar una solicitud que incluya el ID de transacción local.