Menengah3 menit baca

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.

  • ReturnValues mengembalikan 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/DeleteItem hanya menerima NONE atau ALL_OLD; UpdateItem menerima 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:

  1. GetItem untuk membaca status saat ini,
  2. UpdateItem untuk 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:

ReturnValuesMengembalikanGunakan saat
NONEtidak adaAnda tidak butuh Item kembali (default)
ALL_OLDseluruh Item, pra-penulisanauditing / "apa yang baru saja saya ganti?"
UPDATED_OLDatribut yang berubah, pra-penulisanAnda hanya peduli pada field yang Anda sentuh
ALL_NEWseluruh Item, pasca-penulisanAnda butuh Item lengkap yang segar untuk dikembalikan ke pemanggil
UPDATED_NEWatribut yang berubah, pasca-penulisanmembaca 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.

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.

Meninjau perubahan bertahap sebuah Item di DynoTable — nilai lama dan baru sebelum update di-commit.
Meninjau perubahan bertahap sebuah Item di DynoTable — nilai lama dan baru sebelum update di-commit.

Jebakan dan langkah berikutnya

  • Jangan GetItem-lalu-tulis untuk membaca di sekitar sebuah perubahan — itu sebuah round trip dan sebuah race; gunakan ReturnValues.
  • UPDATED_* hanya mengembalikan atribut yang disentuh — jika Anda butuh seluruh Item, gunakan ALL_*.
  • PutItem/DeleteItem tidak bisa mengembalikan nilai baru — hanya NONE/ALL_OLD.
  • ReturnValues bukan pengganti sebuah condition — untuk menjaga sebuah penulisan, tambahkan sebuah condition expression; untuk membaca kembali efeknya, gunakan ReturnValues. 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.

Diperbarui