Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
DynamoDB dan 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
denganDynamoDBSaveExpression
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
— Metodedelete
mengambil sebuah objek sebagai parameter, danDynamoDBMapper
melakukan pemeriksaan versi sebelum menghapus item. Pemeriksaan versi dapat dinonaktifkan jikaDynamoDBMapperConfig.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. -
Delete
—DynamoDBMapper
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 operasiConditionCheck
. An SdkClientException akan dilemparkan ketikaConditionCheck
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 D ynamoDBMapper .
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
transactionWrite Metode ini tidak mendukung D ynamoDBMapper Config. 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));