Saltar al contenido

¿Cómo implemento el bloqueo optimista en una tabla de DynamoDB?

2 minutos de lectura
0

Quiero usar un bloqueo optimista para mi tabla de Amazon DynamoDB en lugar de DynamoDBMapper.

Descripción corta

Para implementar un bloqueo optimista sin un DynamoDBMapper, escribe código personalizado en tu AWS SDK con expresiones de condición y actualización. El código personalizado comprueba si los números de versión de la tabla coinciden.

Resolución

Sigue estos pasos:

  1. Crea una tabla de DynamoDB con un atributo de número de versión.
    Nota: Debes asociar un número de versión a cada elemento que desees actualizar.

  2. Agrega la instrucción SET a la expresión de actualización para actualizar el elemento. Si no tienes una expresión de actualización, crea una.
    Ejemplo de sintaxis de expresión de actualización:

    UpdateExpression='SET #attr = :val',
    ExpressionAttributeNames={
        '#attr': 'attribute_to_update'
    },
    ExpressionAttributeValues={
        ':val': new_value
    },
    ConditionExpression='condition_expression'

    Nota: Sustituye attribute_to_update por tus atributos y new_value por el nuevo valor al que deseas actualizar.

  3. Actualiza la expresión de condición para probar el número de versión entre la solicitud y el valor de la tabla de DynamoDB. Si no tienes una expresión de condición, crea una.
    Ejemplo de sintaxis de expresión de condición:

    ExpressionAttributeNames = {
        "#attr": "attribute_name"
    }
    
    ExpressionAttributeValues = {
        ":val": "new_value"
    }

    Nota: Sustituye attribute_name por el nombre del atributo de tu expresión y new_value por el nuevo valor al que deseas actualizar.

Si los números de versión coinciden, la actualización se ha realizado correctamente. Si los números de versión no coinciden, recibirás el error «ConditionalCheckFailedExpection» y no podrás sobrescribir los cambios que realicen otros clientes.

Para administrar el error «ConditionalCheckFailedExpection», utiliza la siguiente lógica de gestión de errores en tu AWS SDK:

print("Update successful")
except ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
print("Item was modified by another process. Please retry.")
else: raise e

Para probar tus expresiones personalizadas, incluye un número de versión incorrecto en la solicitud.

Información relacionada

Colocación de un elemento (Java)

Colocación de un elemento (.NET)

Ejemplo de la CLI de expresión de condición de DynamoDB

Why do I get a "ConditionalCheckFailedException" error in DynamoDB? (¿Por qué aparece el error «ConditionalCheckFailedException» en DynamoDB?)

OFICIAL DE AWSActualizada hace 2 meses