DynamoDB ReturnValues: Dapatkan Item Lama atau Baru dari Sebuah Penulisan
Secara default sebuah penulisan DynamoDB tidak mengembalikan apa pun selain keberhasilan.
Tetapi Anda sering membutuhkan data di sekitar penulisan itu — nilai sebelum Anda
mengubahnya, atau nilai segar setelahnya. Solusi naif adalah GetItem kedua, yang
merupakan round trip ekstra sekaligus sebuah race: orang lain bisa menulis di
antaranya. DynamoDB menghindari keduanya dengan parameter ReturnValues, yang
menyerahkan kembali Item lama atau baru secara atomik sebagai bagian dari penulisan itu
sendiri.
Apa yang dilakukan ReturnValues di DynamoDB?
ReturnValues memberi tahu penulisan DynamoDB untuk mengembalikan Item sebagai bagian dari
panggilan yang sama, sehingga Anda melewati GetItem kedua dan race yang ditimbulkannya.
PutItem dan DeleteItem menerima NONE atau ALL_OLD; UpdateItem menerima kelimanya
(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW), mengembalikan nilai lama atau
baru secara atomik.
ReturnValuesmengembalikan Item sebagai bagian dari penulisan — tanpa pembacaan kedua, tanpa race.NONE(default) — tidak mengembalikan apa pun.ALL_OLD— seluruh Item sebagaimana adanya sebelum penulisan.UPDATED_OLD— hanya atribut yang diubah update, nilai sebelum.ALL_NEW— seluruh Item setelah penulisan.UPDATED_NEW— hanya atribut yang berubah, nilai setelah.PutItem/DeleteItemhanya menerimaNONEatauALL_OLD;UpdateItemmenerima kelimanya.
Masalahnya: Anda butuh nilai yang baru saja Anda timpa
Misalkan Anda menjalankan meja dukungan dan seorang agen mengubah status sebuah tiket
dari open menjadi pending. Audit log Anda perlu mencatat status apa sebelumnya
perubahan itu. Tanpa ReturnValues Anda akan:
GetItemuntuk membaca status saat ini,UpdateItemuntuk menetapkan yang baru.
Di antara langkah 1 dan 2 agen lain bisa mengubah status — kini audit log Anda mencatat
nilai "sebelum" yang basi. Lebih buruk lagi, itu dua panggilan untuk satu operasi logis.
ReturnValues meruntuhkannya menjadi satu UpdateItem atomik yang mengembalikan status
lama sebagaimana adanya secara persis pada saat penulisan.
Kelima opsi, dan kapan menggunakan masing-masing
UpdateItem mendukung set lengkapnya; pilihannya adalah irisan Item mana dan sisi
mana dari penulisan yang Anda butuhkan:
ReturnValues | Mengembalikan | Gunakan saat |
|---|---|---|
NONE | tidak ada | Anda tidak butuh Item kembali (default) |
ALL_OLD | seluruh Item, pra-penulisan | auditing / "apa yang baru saja saya ganti?" |
UPDATED_OLD | atribut yang berubah, pra-penulisan | Anda hanya peduli pada field yang Anda sentuh |
ALL_NEW | seluruh Item, pasca-penulisan | Anda butuh Item lengkap yang segar untuk dikembalikan ke pemanggil |
UPDATED_NEW | atribut yang berubah, pasca-penulisan | membaca kembali counter/nilai yang baru Anda inkremen |
UPDATED_NEW adalah pahlawan sehari-hari: inkremen sebuah counter dengan
update expression dan baca total baru kembali dalam
panggilan yang sama, tanpa race. Untuk audit tiket-dukungan, ALL_OLD (atau
UPDATED_OLD jika Anda hanya mencatat field status) menangkap keadaan pra-perubahan
secara atomik.
Perhatikan asimetrinya: PutItem dan DeleteItem hanya mendukung NONE dan
ALL_OLD — tidak ada nilai "baru" untuk dikembalikan dari sebuah delete, dan nilai
baru sebuah put hanyalah apa yang Anda kirim. Hanya UpdateItem, yang memodifikasi di
tempat, yang menawarkan kelimanya.
AWS mendokumentasikan
matriks persisnya.
Menulis update di DynoTable
Rakit UpdateItem dan update expression-nya secara visual dengan
DynamoDB expression builder — ia memancarkan klausa
SET/ADD ditambah map attribute-name dan value. Di dalam aplikasi, DynoTable
menampilkan Item hasil setelah penulisan ter-stage di-Commit, jadi Anda melihat keadaan
baru secara langsung.

Jebakan dan langkah berikutnya
- Jangan
GetItem-lalu-tulis untuk membaca di sekitar sebuah perubahan — itu sebuah round trip dan sebuah race; gunakanReturnValues. UPDATED_*hanya mengembalikan atribut yang disentuh — jika Anda butuh seluruh Item, gunakanALL_*.PutItem/DeleteItemtidak bisa mengembalikan nilai baru — hanyaNONE/ALL_OLD.ReturnValuesbukan pengganti sebuah condition — untuk menjaga sebuah penulisan, tambahkan sebuah condition expression; untuk membaca kembali efeknya, gunakanReturnValues. Keduanya saling melengkapi.- Terkait: update expressions, atomic counters.
Ingin membuat editan dan melihat sebelum/sesudah tanpa men-skrip dua panggilan? Unduh DynoTable dan edit Item Anda secara langsung.


