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.
ReturnValuesitem'ı 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/DeleteItemyalnızcaNONEveyaALL_OLDkabul eder;UpdateItembeş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:
Mevcut durumu okumak için
GetItem,Yenisini ayarlamak için
UpdateItem.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.
ReturnValuesbunu, eski durumu yazma anında gerçekte olduğu haliyle döndüren tek bir atomikUpdateItem'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:
ReturnValues | Döndürür | Şu durumda kullanın |
|---|---|---|
NONE | hiçbir şey | item'ı geri istemiyorsunuz (varsayılan) |
ALL_OLD | tüm item, yazma öncesi | denetim / "az önce neyi değiştirdim?" |
UPDATED_OLD | değişen attr'lar, yazma öncesi | yalnızca dokunduğunuz alanları önemsiyorsunuz |
ALL_NEW | tüm item, yazma sonrası | bir çağırana döndürmek için taze tam item'a ihtiyacınız var |
UPDATED_NEW | değ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.

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;ReturnValueskullanın. UPDATED_*yalnızca dokunulan attribute'ları döndürür — tüm item'a ihtiyacınız varsaALL_*kullanın.PutItem/DeleteItemyeni değer döndüremez — yalnızcaNONE/ALL_OLD.ReturnValuesbir koşulun yerine geçmez — bir yazmayı korumak için bir koşul ifadesi ekleyin; etkisini geri okumak içinReturnValueskullanı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.


