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 untuk memastikan bahwa item sisi klien yang Anda perbarui (atau hapus) sama dengan item di Amazon DynamoDB. Jika Anda menggunakan strategi ini, penulisan basis data Anda dilindungi agar tidak ditimpa oleh penulisan orang lain, dan sebaliknya.

Dengan penguncian optimis, setiap item memiliki atribut yang berfungsi sebagai nomor versi. Jika Anda mengambil item dari tabel, aplikasi akan mencatat nomor versi item tersebut. Anda dapat memperbarui item, tetapi hanya jika nomor versi di sisi server tidak berubah. Jika ada ketidakcocokan versi, artinya orang lain telah mengubah item sebelum Anda melakukannya. Upaya pembaruan gagal, karena versi item Anda sudah usang. Jika ini terjadi, coba lagi dengan mengambil item dan kemudian mencoba memperbaruinya. Penguncian optimis mencegah Anda menimpa perubahan secara tidak sengaja yang dibuat oleh orang lain. Penguncian optimis juga mencegah orang lain menimpa perubahan Anda secara tidak sengaja.

Meskipun Anda dapat menerapkan strategi penguncian optimis Anda sendiri, AWS SDK for Java memberikan @DynamoDBVersionAttribute anotasi. Di kelas pemetaan untuk tabel, Anda menetapkan satu properti untuk menyimpan nomor versi, dan menandainya menggunakan anotasi ini. Saat Anda menyimpan objek, item terkait dalam tabel DynamoDB akan memiliki atribut yang menyimpan nomor versi. DynamoDBMapper menetapkan nomor versi saat Anda pertama kali menyimpan objek, dan otomatis menambahkan nomor versi setiap kali Anda memperbarui item. Permintaan perbarui atau hapus Anda hanya akan berhasil jika versi objek sisi klien cocok dengan nomor versi item yang sesuai dalam tabel DynamoDB.

ConditionalCheckFailedException ditampilkan jika:

  • Anda menggunakan penguncian optimis dengan @DynamoDBVersionAttribute dan nilai versi pada server yang berbeda dari nilai pada sisi klien.

  • Anda menentukan batasan bersyarat Anda sendiri saat menyimpan data menggunakan DynamoDBMapper dengan DynamoDBSaveExpression dan batasan ini gagal.

catatan
  • Tabel global DynamoDB menggunakan rekonsiliasi “penulis terakhir menang” antara pembaruan bersamaan. Jika Anda menggunakan tabel global, kebijakan penulis terakhir akan menang. Jadi dalam hal ini, strategi penguncian tidak berfungsi seperti yang diharapkan.

  • Operasi tulis transaksional DynamoDBMapper tidak mendukung ekspresi syarat dan anotasi @DynamoDBVersionAttribute pada objek yang sama. Jika sebuah objek dalam penulisan transaksional dianotasi dengan @DynamoDBVersionAttribute dan juga memiliki ekspresi kondisi, maka akan dilemparkan. SdkClientException

Misalnya, kode Java berikut mendefinisikan kelas CatalogItem yang memiliki beberapa properti. Properti Version ditandai dengan anotasi @DynamoDBVersionAttribute.

contoh
@DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { private Integer id; private String title; private String ISBN; private Set<String> bookAuthors; private String someProp; private Long version; @DynamoDBHashKey(attributeName="Id") public Integer getId() { return id; } public void setId(Integer Id) { this.id = Id; } @DynamoDBAttribute(attributeName="Title") public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @DynamoDBAttribute(attributeName="ISBN") public String getISBN() { return ISBN; } public void setISBN(String ISBN) { this.ISBN = ISBN;} @DynamoDBAttribute(attributeName = "Authors") public Set<String> getBookAuthors() { return bookAuthors; } public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; } @DynamoDBIgnore public String getSomeProp() { return someProp;} public void setSomeProp(String someProp) {this.someProp = someProp;} @DynamoDBVersionAttribute public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version;} }

Anda dapat menerapkan anotasi @DynamoDBVersionAttribute untuk jenis yang dapat dinihilkan yang diberikan oleh kelas pembungkus primitif yang menyediakan jenis yang dapat di-null-kan, seperti Long dan Integer.

Penguncian optimis memiliki dampak sebagai berikut pada metode DynamoDBMapper ini:

  • save — Untuk item baru, DynamoDBMapper menetapkan nomor versi awal 1. Jika Anda mengambil item, memperbarui satu atau beberapa propertinya, dan mencoba untuk menyimpan perubahan, operasi simpan hanya akan berhasil jika nomor versi di sisi klien dan sisi server cocok. DynamoDBMapper menambah nomor versi secara otomatis.

  • delete — Metode delete mengambil sebuah objek sebagai parameter, dan DynamoDBMapper melakukan pemeriksaan versi sebelum menghapus item. Pemeriksaan versi dapat dinonaktifkan jika DynamoDBMapperConfig.SaveBehavior.CLOBBER ditentukan dalam permintaan.

    Implementasi internal penguncian optimis dalam DynamoDBMapper menggunakan pembaruan bersyarat dan dukungan penghapusan bersyarat yang disediakan oleh DynamoDB.

  • transactionWrite

    • Put — Untuk item baru, DynamoDBMapper menetapkan nomor versi awal 1. Jika Anda mengambil item, memperbarui satu atau beberapa propertinya, dan mencoba untuk menyimpan perubahan, operasi masukkan hanya akan berhasil jika nomor versi di sisi klien dan sisi server cocok. DynamoDBMapper menambah nomor versi secara otomatis.

    • Update — Untuk item baru, DynamoDBMapper menetapkan nomor versi awal 1. Jika Anda mengambil item, memperbarui satu atau beberapa propertinya, dan mencoba untuk menyimpan perubahan, operasi perbarui hanya akan berhasil jika nomor versi di sisi klien dan sisi server cocok. DynamoDBMapper menambah nomor versi secara otomatis.

    • DeleteDynamoDBMapper melakukan pemeriksaan versi sebelum menghapus item. Operasi hapus hanya akan berhasil jika nomor versi pada sisi klien dan sisi server cocok.

    • ConditionCheck — Anotasi @DynamoDBVersionAttribute tidak didukung untuk operasi ConditionCheck. An SdkClientException akan dilemparkan ketika ConditionCheck item dianotasi dengan. @DynamoDBVersionAttribute

Menonaktifkan penguncian optimis

Untuk menonaktifkan penguncian optimis, Anda dapat mengubah nilai enumerasi DynamoDBMapperConfig.SaveBehavior dari UPDATE menjadi CLOBBER. Anda dapat melakukannya dengan membuat instans DynamoDBMapperConfig yang melewatkan pemeriksaan versi dan menggunakan instans ini untuk semua permintaan Anda. Untuk informasi tentang DynamoDBMapperConfig.SaveBehavior dan parameter DynamoDBMapper opsional lainnya, lihat Pengaturan konfigurasi opsional untuk DynamoDBMapper .

Anda juga dapat mengatur perilaku penguncian untuk operasi tertentu saja. Misalnya, cuplikan Java berikut menggunakan DynamoDBMapper untuk menyimpan item katalog. Cuplikan ini menentukan DynamoDBMapperConfig.SaveBehavior dengan menambahkan parameter DynamoDBMapperConfig opsional untuk metode save.

catatan

Metode TransactionWrite tidak mendukung DynamoDB. MapperConfig SaveBehaviorkonfigurasi. Menonaktifkan penguncian optimis untuk transactionWrite tidak didukung.

contoh
DynamoDBMapper mapper = new DynamoDBMapper(client); // Load a catalog item. CatalogItem item = mapper.load(CatalogItem.class, 101); item.setTitle("This is a new title for the item"); ... // Save the item. mapper.save(item, new DynamoDBMapperConfig( DynamoDBMapperConfig.SaveBehavior.CLOBBER));