View a markdown version of this page

Penguncian pesimis dengan transaksi DynamoDB - Amazon DynamoDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Penguncian pesimis dengan transaksi DynamoDB

Transaksi DynamoDB menyediakan pendekatan semua atau tidak sama sekali untuk operasi yang dikelompokkan. Saat Anda menggunakanTransactWriteItems, DynamoDB memantau semua item dalam transaksi. Jika ada item yang dimodifikasi oleh operasi lain selama transaksi, seluruh transaksi dibatalkan dan DynamoDB mengembalikan a. TransactionCanceledException Perilaku ini memberikan bentuk kontrol konkurensi pesimistis karena modifikasi bersamaan yang bertentangan dicegah daripada terdeteksi setelah fakta.

Kapan menggunakan transaksi untuk mengunci

Transaksi sangat cocok ketika:

  • Anda perlu memperbarui beberapa item secara atomik, baik dalam tabel yang sama atau di seluruh tabel.

  • Logika bisnis Anda membutuhkan semantik semua atau tidak sama sekali - baik semua perubahan berhasil atau tidak ada yang diterapkan.

Contoh umum termasuk mentransfer dana antar akun, menempatkan pesanan yang memperbarui tabel inventaris dan pesanan, dan bertukar item antar pemain dalam permainan.

Pengorbanan

Biaya penulisan yang lebih tinggi

Untuk item hingga 1 KB, transaksi menggunakan 2 WCU per item (satu untuk mempersiapkan, satu untuk komit), dibandingkan dengan 1 WCU untuk penulisan standar.

Batas barang

Satu transaksi dapat mencakup hingga 100 tindakan di satu atau lebih tabel.

Sensitivitas konflik

Jika ada item dalam transaksi yang dimodifikasi oleh operasi lain, seluruh transaksi gagal. Dalam skenario perdebatan tinggi, ini dapat menyebabkan seringnya pembatalan.

Implementasi

Contoh berikut digunakan TransactWriteItems untuk mentransfer inventaris antara dua item secara atomik. Jika proses lain memodifikasi salah satu item selama transaksi, seluruh operasi akan dibatalkan.

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

Dalam contoh ini, ekspresi kondisi memeriksa apakah ada inventaris yang cukup, tetapi tidak diperlukan atribut versi. DynamoDB secara otomatis membatalkan transaksi jika ada item dalam transaksi yang dimodifikasi oleh operasi lain antara fase persiapan dan komit. Inilah yang memberikan kontrol konkurensi pesimistis — modifikasi bersamaan yang bertentangan dicegah oleh transaksi itu sendiri.

catatan

Anda dapat menggabungkan transaksi dengan penguncian optimis dengan menambahkan pemeriksaan versi sebagai ekspresi kondisi tambahan. Ini memberikan lapisan perlindungan tambahan tetapi tidak diperlukan untuk transaksi untuk mendeteksi konflik.

Untuk informasi selengkapnya, lihat Mengelola alur kerja kompleks dengan DynamoDB Transactions.