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 memberikan pendekatan untuk operasi all-or-nothing 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 pesimis 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 atom, baik dalam tabel yang sama atau di seluruh tabel.

  • Logika bisnis Anda membutuhkan all-or-nothing semantik — baik semua perubahan berhasil atau tidak ada yang diterapkan.

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

Pengorbanan

Biaya tulis lebih tinggi

Untuk item hingga 1 KB, transaksi mengkonsumsi 2 WCUs per item (satu untuk mempersiapkan, satu untuk melakukan), 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 pertengkaran tinggi, ini dapat menyebabkan pembatalan yang sering terjadi.

Implementasi

Contoh berikut digunakan TransactWriteItems untuk mentransfer inventaris antara dua item secara atom. Jika proses lain memodifikasi salah satu item selama transaksi, seluruh operasi 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 inventaris yang cukup ada, tetapi tidak ada atribut versi yang diperlukan. 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.