Orta3 dakikalık okuma

DynamoDB ReturnValues: Bir Yazmadan Eski veya Yeni Item'ı Alın

Varsayılan olarak bir DynamoDB yazması başarıdan başka bir şey döndürmez. Ama çoğu zaman yazmanın çevresindeki veriye ihtiyacınız olur — değiştirmeden önceki değer ya da sonraki taze değer. Saf çözüm ikinci bir GetItem'dır, ki bu fazladan bir gidiş dönüş ve bir yarış: arada başka biri yazabilir. DynamoDB her ikisini de ReturnValues parametresiyle önler; bu parametre, eski veya yeni item'ı yazmanın kendisinin bir parçası olarak atomik biçimde geri verir.

DynamoDB'de ReturnValues ne işe yarar?

ReturnValues, bir DynamoDB yazmasına item'ı aynı çağrının parçası olarak geri vermesini söyler; böylece ikinci bir GetItem ve yarattığı yarış koşulundan kurtulursunuz. PutItem ve DeleteItem yalnızca NONE veya ALL_OLD kabul eder; UpdateItem ise eski veya yeni değerleri atomik olarak döndürerek beşini de (NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW) kabul eder.

  • ReturnValues item'ı yazmanın bir parçası olarak döndürür — ikinci okuma yok, yarış yok.
  • NONE (varsayılan) — hiçbir şey döndürmez.
  • ALL_OLD — yazmadan önceki haliyle tüm item.
  • UPDATED_OLD — yalnızca güncellemenin değiştirdiği attribute'lar, önceki değerler.
  • ALL_NEW — yazmadan sonraki tüm item.
  • UPDATED_NEW — yalnızca değişen attribute'lar, sonraki değerler.
  • PutItem/DeleteItem yalnızca NONE veya ALL_OLD kabul eder; UpdateItem beşini de kabul eder.

Sorun: az önce üzerine yazdığınız değere ihtiyacınız var

Diyelim ki bir destek masası çalıştırıyorsunuz ve bir temsilci bir biletin durumunu open'dan pending'e değiştiriyor. Denetim günlüğünüzün değişiklikten önce durumun ne olduğunu kaydetmesi gerekir. ReturnValues olmadan şunu yapardınız:

  1. Mevcut durumu okumak için GetItem,

  2. Yenisini ayarlamak için UpdateItem.

  3. ve 2. adımlar arasında başka bir temsilci durumu değiştirebilir — şimdi denetim günlüğünüz bayat bir "önce" değeri kaydeder. Daha kötüsü, tek bir mantıksal işlem için iki çağrıdır. ReturnValues bunu, eski durumu yazma anında gerçekte olduğu haliyle döndüren tek bir atomik UpdateItem'a katlar.

Beş seçenek ve her birini ne zaman kullanmalı

UpdateItem tüm kümeyi destekler; seçim, item'ın hangi diliminin ve yazmanın hangi tarafının gerektiğidir:

ReturnValuesDöndürürŞu durumda kullanın
NONEhiçbir şeyitem'ı geri istemiyorsunuz (varsayılan)
ALL_OLDtüm item, yazma öncesidenetim / "az önce neyi değiştirdim?"
UPDATED_OLDdeğişen attr'lar, yazma öncesiyalnızca dokunduğunuz alanları önemsiyorsunuz
ALL_NEWtüm item, yazma sonrasıbir çağırana döndürmek için taze tam item'a ihtiyacınız var
UPDATED_NEWdeğişen attr'lar, yazma sonrasıaz önce artırdığınız bir sayaç/değeri geri okuma

UPDATED_NEW günlük kahramandır: bir update ifadesi ile bir sayacı artırın ve yeni toplamı aynı çağrıda geri okuyun, yarış yok. Destek-bileti denetimi için, ALL_OLD (veya yalnızca durum alanını günlüklüyorsanız UPDATED_OLD) değişiklik öncesi durumu atomik biçimde yakalar.

Asimetriye dikkat: PutItem ve DeleteItem yalnızca NONE ve ALL_OLD'u destekler — bir silme için döndürülecek "yeni" değer yoktur ve bir put'un yeni değeri zaten gönderdiğiniz şeydir. Yalnızca yerinde değiştiren UpdateItem beşini de sunar. AWS, tam matrisi belgeliyor.

DynoTable'da güncellemeyi yazmak

UpdateItem'ı ve update ifadesini görsel olarak DynamoDB expression builder ile birleştirin — SET/ADD cümlesini artı attribute-adı ve değer haritalarını üretir. Uygulamada, DynoTable hazırlanmış bir yazma işlendikten sonra oluşan item'ı gösterir, böylece yeni durumu doğrudan görürsünüz.

DynoTable'da bir item'ın hazırlanmış değişikliğini inceleme — güncelleme işlenmeden önceki eski ve yeni değerler.
DynoTable'da bir item'ın hazırlanmış değişikliğini inceleme — güncelleme işlenmeden önceki eski ve yeni değerler.

Tuzaklar + sonraki adımlar

  • Bir değişikliğin çevresini okumak için GetItem-sonra-yaz yapmayın — bu bir gidiş dönüş ve bir yarıştır; ReturnValues kullanın.
  • UPDATED_* yalnızca dokunulan attribute'ları döndürür — tüm item'a ihtiyacınız varsa ALL_* kullanın.
  • PutItem/DeleteItem yeni değer döndüremez — yalnızca NONE/ALL_OLD.
  • ReturnValues bir koşulun yerine geçmez — bir yazmayı korumak için bir koşul ifadesi ekleyin; etkisini geri okumak için ReturnValues kullanın. Birlikte çalışırlar.
  • İlgili: update ifadeleri, atomik sayaçlar.

İki çağrı yazmadan düzenleme yapıp öncesini/sonrasını görmek mi istiyorsunuz? DynoTable'ı indirin ve item'larınızı doğrudan düzenleyin.

Güncellendi