Todos los productos
Search
Centro de documentos

Tablestore:Uso de transacciones locales

Última actualización: Sep 03, 2026

Utilice Tablestore SDK for Python para agrupar operaciones de lectura y escritura correspondientes a un mismo valor de clave de partición en una operación atómica. De este modo, todas las escrituras se confirman o se descartan en conjunto.

Requisitos previos

  • Instale Tablestore SDK for Python e inicialice un cliente.

  • Las transacciones locales están habilitadas para la tabla.

    Nota

    Para habilitar las transacciones locales en una tabla existente o comprobar si esta función está activada, envíe un ticket .

Descripción de la función

Una transacción local se limita a un único valor de clave de partición y utiliza el nivel de aislamiento Read Committed. Las solicitudes dentro de la transacción comparten un ID de transacción. Para usar una transacción local, siga estos pasos:

  1. Llame a start_local_transaction con el valor de la clave de partición para obtener un ID de transacción.

  2. Llame a get_row, put_row, update_row, delete_row, batch_write_row o get_range dentro de la transacción y pase el ID en transaction_id.

  3. Llame a commit_transaction para confirmar todas las escrituras o a abort_transaction para descartarlas.

def start_local_transaction(self, table_name, key)
def commit_transaction(self, transaction_id)
def abort_transaction(self, transaction_id)

El siguiente ejemplo inicia una transacción local para el valor de clave de partición device, escribe una fila y confirma la transacción.

table_name = "example_table"
partition_key = [("partition", "device")]
transaction_id = client.start_local_transaction(table_name, partition_key)

primary_key = [("partition", "device"), ("id", 1)]
row = Row(primary_key, [("status", "online")])
condition = Condition(RowExistenceExpectation.IGNORE)
client.put_row(
    table_name,
    row,
    condition,
    transaction_id=transaction_id,
)

client.commit_transaction(transaction_id)

Parámetros

Una transacción local incluye los siguientes parámetros clave.

Nombre

Tipo

Descripción

table_name (obligatorio)

str

El nombre de la tabla.

key (obligatorio)

List[Tuple]

La clave de partición que se usa para iniciar la transacción local. Especifique únicamente el nombre y el valor de la primera columna de clave principal.

primary_key (obligatorio)

List[Tuple]

La clave principal completa que se usa para leer o escribir una fila en la transacción. Especifique todas las columnas de la clave principal. Para las escrituras, el valor de la clave de partición debe coincidir con key.

transaction_id (obligatorio)

str

El ID de la transacción local devuelto por start_local_transaction. Pase este ID en cada solicitud de lectura, escritura, confirmación o cancelación dentro de la transacción.

Límites

  • Las transacciones locales no son compatibles con columnas de clave principal de incremento automático.

  • Las transacciones locales utilizan bloqueo pesimista. Durante una transacción, se mantiene un bloqueo de escritura sobre los datos del valor de la clave de partición; solo las escrituras que incluyen el ID de transacción pueden completarse correctamente.

  • La duración máxima de una transacción es de 60 segundos. Si dos operaciones consecutivas tienen una separación mayor a 60 segundos, la transacción caduca y el servidor la descarta.

  • Un ID de transacción solo puede utilizarse en una solicitud a la vez. Las solicitudes simultáneas que comparten el mismo ID fallarán.

  • Cada escritura dentro de una transacción debe usar el valor de clave de partición que inició dicha transacción. Las lecturas no tienen esta restricción.

  • Una sola transacción puede escribir hasta 4 MB de datos.

  • Si la escritura de una columna de atributo no especifica una versión de datos, el servidor genera la versión en el momento de la escritura, no en el de la confirmación.

  • Cuando una solicitud BatchWriteRowRequest incluye un ID de transacción, todas las filas deben dirigirse a la tabla donde se inició la transacción.

  • Si una transacción no contiene escrituras, las operaciones de confirmación y cancelación tienen el mismo efecto y ambas liberan la transacción.

  • Una lectura o escritura con errores que incluya un ID de transacción no finaliza la transacción. Reintente la solicitud o cancele la transacción explícitamente.

Ejemplos

Lectura de una fila en una transacción

El siguiente ejemplo lee una fila dentro de una transacción local. En una transacción de solo lectura, las operaciones de confirmación y cancelación producen el mismo resultado.

table_name = "example_table"
partition_key = [("partition", "device")]
transaction_id = client.start_local_transaction(table_name, partition_key)

primary_key = [("partition", "device"), ("id", 1)]
consumed, return_row, next_token = client.get_row(
    table_name,
    primary_key,
    transaction_id=transaction_id,
)
print(return_row.primary_key, return_row.attribute_columns)

client.commit_transaction(transaction_id)

Escritura por lotes de filas en una transacción

El siguiente ejemplo llama a set_transaction_id para incluir el ID de transacción en una solicitud por lotes. El valor de la clave de partición de cada fila debe coincidir con el valor usado para iniciar la transacción.

table_name = "example_table"
partition_key = [("partition", "device")]
transaction_id = client.start_local_transaction(table_name, partition_key)

condition = Condition(RowExistenceExpectation.IGNORE)
row_items = [
    PutRowItem(Row([("partition", "device"), ("id", 2)], [("status", "online")]), condition),
    PutRowItem(Row([("partition", "device"), ("id", 3)], [("status", "offline")]), condition),
]
request = BatchWriteRowRequest()
request.add(TableInBatchWriteRowItem(table_name, row_items))
request.set_transaction_id(transaction_id)

response = client.batch_write_row(request)
if response.is_all_succeed():
    client.commit_transaction(transaction_id)
else:
    client.abort_transaction(transaction_id)