Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Pessimistisches Sperren bei DynamoDB-Transaktionen
DynamoDB-Transaktionen bieten einen Alles-oder-Nichts-Ansatz für gruppierte Operationen. Wenn Sie DynamoDB verwendenTransactWriteItems, überwacht es alle Elemente in der Transaktion. Wenn ein Element während der Transaktion durch einen anderen Vorgang geändert wird, wird die gesamte Transaktion storniert und DynamoDB gibt a zurück. TransactionCanceledException Dieses Verhalten bietet eine Form der pessimistischen Kontrolle der Parallelität, da widersprüchliche gleichzeitige Änderungen verhindert und nicht erst im Nachhinein erkannt werden.
Wann sollten Transaktionen zum Sperren verwendet werden
Transaktionen eignen sich gut, wenn:
Sie müssen mehrere Elemente atomar aktualisieren, entweder innerhalb derselben Tabelle oder tabellenübergreifend.
Ihre Geschäftslogik erfordert eine Alles-oder-Nichts-Semantik — entweder sind alle Änderungen erfolgreich oder keine werden angewendet.
Zu den häufigsten Beispielen gehören Geldtransfers zwischen Konten, Bestellungen, die sowohl das Inventar als auch die Bestelltabellen aktualisieren, und der Austausch von Gegenständen zwischen Spielern in einem Spiel.
Kompromisse
- Höhere Schreibkosten
Bei Elementen bis zu 1 KB verbrauchen Transaktionen 2 WCUs pro Element (eine für die Vorbereitung, eine für die Übertragung), im Vergleich zu 1 WCU für einen Standard-Schreibvorgang.
- Limit für Artikel
Eine einzelne Transaktion kann bis zu 100 Aktionen in einer oder mehreren Tabellen umfassen.
- Konfliktsensitivität
Wenn ein Element in der Transaktion durch einen anderen Vorgang geändert wird, schlägt die gesamte Transaktion fehl. In Szenarien mit hohem Streitaufkommen kann dies zu häufigen Stornierungen führen.
Implementierung
Das folgende Beispiel wird verwendetTransactWriteItems, um Inventar zwischen zwei Artikeln atomar zu übertragen. Wenn ein anderer Prozess eines der Elemente während der Transaktion ändert, wird der gesamte Vorgang rückgängig gemacht.
import boto3 client = boto3.client('dynamodb') def transfer_inventory(source_id, target_id, quantity): try: client.transact_write_items( TransactItems=[ { 'Update': { 'TableName': 'Inventory', 'Key': {'ItemID': {'S': source_id}}, 'UpdateExpression': 'SET QuantityLeft = QuantityLeft - :qty', 'ConditionExpression': 'QuantityLeft >= :qty', 'ExpressionAttributeValues': { ':qty': {'N': str(quantity)} } } }, { 'Update': { 'TableName': 'Inventory', 'Key': {'ItemID': {'S': target_id}}, 'UpdateExpression': 'SET QuantityLeft = QuantityLeft + :qty', 'ExpressionAttributeValues': { ':qty': {'N': str(quantity)} } } } ] ) return True except client.exceptions.TransactionCanceledException as e: print(f"Transaction canceled: {e}") return False
In diesem Beispiel überprüft der Bedingungsausdruck, ob ausreichend Inventar vorhanden ist, aber kein Versionsattribut erforderlich ist. DynamoDB storniert die Transaktion automatisch, wenn ein Element in der Transaktion zwischen der Vorbereitungs- und der Festschreibphase durch einen anderen Vorgang geändert wird. Dies ermöglicht die pessimistische Kontrolle der Parallelität — widersprüchliche gleichzeitige Änderungen werden durch die Transaktion selbst verhindert.
Anmerkung
Sie können Transaktionen mit optimistischer Sperrung kombinieren, indem Sie Versionsprüfungen als zusätzliche Bedingungsausdrücke hinzufügen. Dies bietet eine zusätzliche Schutzebene, ist aber nicht erforderlich, damit die Transaktion Konflikte erkennt.
Weitere Informationen finden Sie unter Verwalten komplexer Workflows mit DynamoDB-Transaktionen.