Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Penguncian Optimis dengan nomor versi
Penguncian optimis adalah strategi yang mendeteksi konflik pada waktu tulis daripada mencegahnya. Setiap item menyertakan atribut versi yang bertambah dengan setiap pembaruan. Saat memperbarui item, Anda menyertakan ekspresi kondisi yang memeriksa apakah nomor versi cocok dengan nilai yang terakhir dibaca aplikasi Anda. Jika proses lain memodifikasi item sementara itu, kondisi gagal dan DynamoDB mengembalikan a. ConditionalCheckFailedException
Kapan menggunakan penguncian optimis
Penguncian optimis sangat cocok ketika:
Beberapa pengguna atau proses dapat memperbarui item yang sama, tetapi konflik jarang terjadi.
Mencoba kembali penulisan yang gagal tidak mahal untuk aplikasi Anda.
Anda ingin menghindari overhead dan kompleksitas mengelola kunci terdistribusi.
Contoh umum termasuk pembaruan inventaris e-commerce, platform pengeditan kolaboratif, dan catatan transaksi keuangan.
Pengorbanan
- Coba lagi overhead dalam pertengkaran tinggi
Dalam lingkungan konkurensi tinggi, kemungkinan konflik meningkat, berpotensi menyebabkan percobaan ulang dan biaya penulisan yang lebih tinggi.
- Kompleksitas implementasi
Menambahkan kontrol versi ke item dan menangani pemeriksaan bersyarat menambah kompleksitas logika aplikasi. AWS SDK for Java v2 Enhanced Client menyediakan dukungan bawaan melalui
@DynamoDbVersionAttributeanotasi, yang secara otomatis mengelola nomor versi untuk Anda.
Desain pola
Sertakan atribut versi di setiap item. Berikut adalah desain skema sederhana:
Kunci partisi — Pengidentifikasi unik untuk setiap item (misalnya,
ItemId).Atribut:
ItemId— Pengidentifikasi unik untuk item tersebut.Version— Bilangan bulat yang mewakili nomor versi item.QuantityLeft— Inventaris item yang tersisa.
Ketika item pertama kali dibuat, Version atribut diatur ke 1. Dengan setiap pembaruan, nomor versi bertambah 1.
| ItemId (kunci partisi) | Versi | QuantityLeft |
|---|---|---|
| Pisang | 1 | 10 |
| Apel | 1 | 5 |
| Jeruk | 1 | 7 |
Implementasi
Untuk menerapkan penguncian optimis, ikuti langkah-langkah ini:
-
Baca versi item saat ini.
def get_item(item_id): response = table.get_item(Key={'ItemID': item_id}) return response['Item'] item = get_item('Bananas') current_version = item['Version'] -
Perbarui item menggunakan ekspresi kondisi yang memeriksa nomor versi.
def update_item(item_id, qty_bought, current_version): try: response = table.update_item( Key={'ItemID': item_id}, UpdateExpression="SET QuantityLeft = QuantityLeft - :qty, Version = :new_v", ConditionExpression="Version = :expected_v", ExpressionAttributeValues={ ':qty': qty_bought, ':new_v': current_version + 1, ':expected_v': current_version }, ReturnValues="UPDATED_NEW" ) return response except ClientError as e: if e.response['Error']['Code'] == 'ConditionalCheckFailedException': print("Version conflict: another process updated this item.") raise -
Tangani konflik dengan mencoba kembali dengan bacaan baru.
Setiap percobaan lagi membutuhkan pembacaan tambahan, jadi batasi jumlah total percobaan ulang.
def update_with_retry(item_id, qty_bought, max_retries=3): for attempt in range(max_retries): item = get_item(item_id) try: return update_item(item_id, qty_bought, item['Version']) except ClientError as e: if e.response['Error']['Code'] != 'ConditionalCheckFailedException': raise print(f"Retry {attempt + 1}/{max_retries}") raise Exception("Update failed after maximum retries.")
Untuk aplikasi Java, AWS SDK for Java v2 Enhanced Client menyediakan dukungan penguncian optimis bawaan melalui @DynamoDbVersionAttributeanotasi, yang secara otomatis mengelola nomor versi untuk Anda.
Untuk informasi selengkapnya tentang ekspresi kondisi, lihatContoh CLI ekspresi kondisi DynamoDB.