Penguncian Optimis dengan nomor versi - Amazon DynamoDB

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:

  1. 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']
  2. 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
  3. 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.