Menengah5 menit baca

DynamoDB ReturnValues: Dapatkan Item Lama atau Baru

Secara default, penulisan DynamoDB hanya menghasilkan kesuksesan. Namun Anda sering kali membutuhkan datanya sekitar penulisan — nilai sebelum Anda mengubahnya, atau nilai baru setelahnya. Itu perbaikan naif adalah GetItem kedua, yang merupakan perjalanan pulang pergi ekstra dan perlombaan: seseorang lain bisa menulis di antaranya. DynamoDB menghindari keduanya dengan parameter ReturnValues, yang mengembalikan item lama atau baru secara atom sebagai bagian dari penulisan itu sendiri.

Apa yang dilakukan ReturnValues di DynamoDB?

ReturnValues memberitahukan penulisan DynamoDB untuk menyerahkan kembali item tersebut sebagai bagian dari panggilan yang sama, sehingga Anda melewatkan GetItem kedua dan balapan yang dibuatnya. 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 atom.

  • ReturnValues mengembalikan item sebagai bagian dari penulisan — tidak ada pembacaan kedua, tidak ada balapan.
  • NONE (default) — tidak mengembalikan apa pun.
  • ALL_OLD — keseluruhan item seperti sebelum penulisan.
  • UPDATED_OLD — hanya atribut yang diperbarui, nilai before.
  • ALL_NEW — keseluruhan item setelah penulisan.
  • UPDATED_NEW — hanya atribut yang diubah, nilai after.
  • PutItem/DeleteItem hanya menerima NONE atau ALL_OLD; UpdateItem menerima semua lima.

Masalahnya: Anda memerlukan nilai yang baru saja Anda timpa

Katakanlah Anda menjalankan meja dukungan dan agen mengubah status tiket dari open menjadi pending. Log audit Anda perlu mencatat status sebelum perubahan. Tanpa ReturnValues Anda akan:

  1. GetItem untuk membaca status saat ini,
  2. UpdateItem untuk mengatur yang baru.

Antara langkah 1 dan 2 agen lain dapat mengubah status — sekarang catatan log audit Anda nilai "sebelum" yang basi. Lebih buruk lagi, ini adalah dua panggilan untuk satu operasi logis. ReturnValues meruntuhkannya menjadi satu atom UpdateItem yang mengembalikan status lama seperti itu sebenarnya pada waktu menulis.

Lima opsi, dan kapan menggunakan masing-masing opsi

UpdateItem mendukung set lengkap; pilihannya adalah potongan item yang mana dan yang mana sisi tulis yang Anda butuhkan:

ReturnValuesPengembalianGunakan ketika
NONEtidak adaAnda tidak memerlukan item tersebut kembali (default)
ALL_OLDseluruh item, pra-tulisauditing / "apa yang baru saja saya ganti?"
UPDATED_OLDmengubah attr, pra-tulisanda hanya peduli pada bidang yang anda sentuh
ALL_NEWseluruh item, pasca-tulisAnda memerlukan item lengkap yang baru untuk dikembalikan ke penelepon
UPDATED_NEWmengubah attrs, pasca-tulismembaca kembali counter/value yang baru saja Anda tambahkan

UPDATED_NEW adalah pahlawan sehari-hari: menambah penghitung dengan perbarui ekspresi dan baca kembali total yang baru panggilan yang sama, tidak ada balapan. Untuk audit tiket dukungan, ALL_OLD (atau UPDATED_OLD jika Anda hanya mencatat bidang status) menangkap status pra-perubahan secara atom.

Perhatikan asimetrinya: PutItem dan DeleteItem hanya mendukung NONE dan ALL_OLD — tidak ada nilai "baru" yang dapat dikembalikan untuk penghapusan, dan nilai baru dari put adalah nilai Anda dikirim. Hanya UpdateItem, yang bermutasi di tempat, yang menawarkan kelimanya. Dokumen AWS matriks yang tepat.

Rakit UpdateItem dan ekspresi pembaruannya secara visual dengan Pembuat ekspresi DynamoDB — ia memancarkan Klausa SET/ADD ditambah nama atribut dan peta nilai. Di aplikasi, DynoTable menunjukkan item yang dihasilkan setelah penulisan bertahap dilakukan, sehingga Anda melihat status baru secara langsung.

<gambar kelas="doc-media-placeholder" jenis data="tangkapan layar" data-src="docs/guide-dynamodb-returnvalues-update.png"

Meninjau perubahan bertahap item di DynoTable — nilai lama dan baru sebelum pembaruan diterapkan.

Jebakan + langkah selanjutnya

  • Jangan GetItem-lalu-menulis untuk membaca perubahan — ini adalah perjalanan pulang pergi dan balapan; gunakan ReturnValues.
  • UPDATED_* hanya mengembalikan atribut yang disentuh — jika Anda membutuhkan seluruh item, gunakan ALL_*.
  • PutItem/DeleteItem tidak dapat mengembalikan nilai baru — hanya NONE/ALL_OLD.
  • ReturnValues bukan pengganti suatu kondisi — untuk guard menulis, tambahkan a ekspresi kondisi; untuk membaca kembali nya efeknya, gunakan ReturnValues. Mereka menulis.
  • Terkait: perbarui ekspresi, penghitung atom.

Ingin mengedit dan melihat before/after tanpa membuat skrip dua panggilan? Unduh DynoTable dan edit item Anda secara langsung.

Penghitung atom dengan UPDATED_NEW

Sistem inventaris menambah bidang version atau stock pada setiap penulisan. Itu polanya adalah satu UpdateItem dengan ADD stock :inc dan ReturnValues: UPDATED_NEW:

UpdateItem  PK=SKU#8842
  UpdateExpression: ADD stock :one
  ExpressionAttributeValues: {":one": {"N": "1"}}
  ReturnValues: UPDATED_NEW
Attributes.stock.N == "41"   (was 40)

Anda hanya menerima peta atribut yang diubah, bukan item lengkap — idealnya saat itemnya besar tetapi penelepon membutuhkan counter baru. Untuk jalur audit itu harus tangkap setiap bidang sebelum diubah, beralih ke ALL_OLD.

Penulisan masih ditagih sebagai UpdateItem pada ukuran item; ReturnValues melakukannya tidak menambahkan biaya baca terpisah — DynamoDB sudah memuat item untuk diterapkan memperbarui.

Catatan kapasitas

Mengembalikan atribut tidak menggandakan biaya penulisan WCU itu sendiri. Anda membayar untuk penulisan berdasarkan ukuran barang sebelum dan sesudah update per AWS aturan, terlepas dari berapa banyak atribut yang muncul dalam payload respons.

Jika Anda tergoda untuk GetItem maka UpdateItem mencatat nilai lama, Anda dibayar untuk membaca dan menulis. ReturnValues: ALL_OLD pada pembaruan menghapus baca seluruhnya — pada item 2 KB dengan 500 pembaruan per detik yang menghemat sekitar 250 RCU yang pada akhirnya konsisten per detik.

Tulis dengan ekspresi kondisi

ReturnValues dan ekspresi kondisi tulis di panggilan yang sama. Contoh: naikkan retryCount hanya saat berada di bawah batas, dan kembalikan hitungan baru:

ConditionExpression: retryCount < :max
UpdateExpression: ADD retryCount :one
ReturnValues: UPDATED_NEW

Jika kondisi gagal, DynamoDB mengembalikan ConditionalCheckFailedException dan tidak ada atribut payload — berbeda dari pembaruan yang berhasil dengan UPDATED_NEW kosong ketika tidak ada yang berubah.

Gunakan pembuat ekspresi untuk menghasilkan UpdateExpression, kondisi, dan nilai yang disusun dipetakan bersama.

Panduan pengambilan keputusan

Anda membutuhkan…PengaturanBekerja pada
Tidak ada yang kembaliNONEPasang, Perbarui, Hapus
Item lengkap sebelum ditimpa/deleteALL_OLDPasang, Perbarui, Hapus
Hanya mengubah bidang, sebelumUPDATED_OLDPembaruan
Item lengkap setelah patchALL_NEWPembaruan
Hanya mengubah bidang, setelahUPDATED_NEWPembaruan

Menghapus dan menempatkan

DeleteItem dengan ReturnValues: ALL_OLD adalah cara Anda menerapkan "pop dan return" semantik pada item antrian — baris yang dihapus muncul kembali di Attributes. Ada tidak ada ALL_NEW yang di hapus karena itemnya sudah tidak ada lagi.

PutItem dengan ALL_OLD mengembalikan item sebelumnya ketika Anda menimpa item yang sudah ada key — berguna untuk alur kerja swap. Jika kuncinya tidak ada, responsnya akan hilang Attributes.

Verifikasi di DynoTable

Tahapan perubahan atribut di editor item: panel tinjauan menampilkan yang lama dan baru nilai berdampingan sebelum melakukan — informasi yang sama UPDATED_OLD dan UPDATED_NEW akan kembali, tanpa menulis skrip. Setelah komit, salin barisnya sebagai JSON untuk perlengkapan pengujian melalui tindakan ekspor jaringan.

Diperbarui