

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
<a name="BestPractices_OptimisticLocking"></a>

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](Expressions.ConditionExpressions.md) 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
<a name="BestPractices_OptimisticLocking_WhenToUse"></a>

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
<a name="BestPractices_OptimisticLocking_Tradeoffs"></a>

**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 [https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE)anotasi, yang secara otomatis mengelola nomor versi untuk Anda.

## Desain pola
<a name="BestPractices_OptimisticLocking_PatternDesign"></a>

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
<a name="BestPractices_OptimisticLocking_Implementation"></a>

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']
   ```

1. 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
   ```

1. 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 [https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE)anotasi, yang secara otomatis mengelola nomor versi untuk Anda.

Untuk informasi selengkapnya tentang ekspresi kondisi, lihat[Contoh CLI ekspresi kondisi DynamoDB](Expressions.ConditionExpressions.md).