중급4분 분량

DynamoDB ReturnValues: 이전 항목 또는 새 항목 가져오기

기본적으로 DynamoDB 쓰기는 성공만 반환합니다. 하지만 종종 데이터가 필요합니다. 주변 쓰기 — 변경하기 전의 값 또는 변경 후의 새로운 값. 는 순진한 수정은 두 번째 GetItem이며, 이는 추가 왕복 그리고 경주입니다. else 사이에 쓸 수 있습니다. DynamoDB는 ReturnValues 매개변수를 사용하여 두 가지를 모두 방지합니다. 쓰기 자체의 일부로 이전 항목이나 새 항목을 원자적으로 돌려줍니다.

DynamoDB에서 ReturnValues는 무엇을 합니까?

ReturnValues는 DynamoDB 쓰기에 동일한 호출의 일부로 항목을 돌려주도록 지시하므로 두 번째 GetItem와 이것이 생성하는 경주를 건너뜁니다. PutItemDeleteItemNONE 또는 ALL_OLD를 허용합니다. UpdateItem은 5개(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW)를 모두 허용하여 이전 값이나 새 값을 원자적으로 반환합니다.

  • ReturnValues는 쓰기의 일부로 항목을 반환합니다 — 두 번째 읽기나 경합이 없습니다.
  • NONE (기본값) — 아무것도 반환하지 않습니다.
  • ALL_OLD — 전체 항목을 이전과 동일하게 작성합니다.
  • UPDATED_OLD — 업데이트로 인해 변경된 속성만 이전 값입니다.
  • ALL_NEW — 쓰기 이후 전체 항목.
  • UPDATED_NEW — 변경된 속성, 이후 값만.
  • PutItem/DeleteItemNONE 또는 ALL_OLD만 허용합니다. UpdateItem는 모두 허용합니다. 다섯.

문제: 방금 덮어쓴 값이 필요합니다.

지원 데스크를 운영하고 있는데 상담원이 티켓 상태를 open에서 다음으로 변경했다고 가정해 보겠습니다. pending. 감사 로그에는 변경 전 상태를 기록해야 합니다. ReturnValues이 없으면:

  1. GetItem 현재 상태를 읽으려면,
  2. UpdateItem를 눌러 새 것을 설정하세요.

1단계와 2단계 사이에 다른 상담원이 상태를 변경할 수 있습니다. 이제 감사 로그가 기록됩니다. 오래된 "이전" 값. 더 나쁜 것은 하나의 논리 연산에 대한 두 번의 호출입니다. ReturnValues 그것을 이전 상태로 되돌리는 단일 원자 UpdateItem로 축소합니다. 실제로는 쓰기 시간이었습니다.

다섯 가지 옵션과 각각의 사용 시기

UpdateItem는 전체 세트를 지원합니다. 선택은 _아이템의 어떤 조각_과 어느 것입니까? write 측면에는 다음이 필요합니다.

ReturnValues반품다음 경우에 사용
NONE아무것도항목을 다시 가져올 필요가 없습니다(기본값)
ALL_OLD전체 항목, 사전 작성감사 / "방금 무엇을 교체했나요?"
UPDATED_OLD변경된 속성, 사전 쓰기당신은 당신이 터치한 필드에만 관심이 있습니다
ALL_NEW전체 항목, 쓰기 후발신자에게 반환하려면 새로운 전체 항목이 필요합니다
UPDATED_NEW변경된 속성, 쓰기 후방금 증가한 카운터/값 다시 읽기

UPDATED_NEW는 일상의 영웅입니다. update expression을 입력하고 새 합계를 다시 읽습니다. 같은 전화, 경주는 없습니다. 지원 티켓 감사의 경우 ALL_OLD(또는 다음과 같은 경우 UPDATED_OLD) 상태 필드만 기록합니다)는 변경 전 상태를 원자적으로 캡처합니다.

비대칭성에 유의하세요. PutItemDeleteItemNONEALL_OLD만 지원합니다 — 삭제 시 반환할 "새" 값은 없으며 풋의 새 값은 바로 보냈습니다. 제자리에서 변이하는 UpdateItem만이 다섯 가지를 모두 제공합니다. AWS documents 정확한 매트릭스.

DynoTable에 업데이트 작성

UpdateItem과 업데이트 표현을 시각적으로 조합합니다. DynamoDB expression builder — 다음을 방출합니다. SET/ADD 절과 속성 이름 및 값 맵. 앱에서는 DynoTable 단계적 쓰기가 커밋된 후 결과 항목을 표시하므로 새 상태를 볼 수 있습니다. 직접 확인할 수 있습니다.

DynoTable에서 항목의 스테이징된 변경을 검토하는 모습 — 업데이트가 커밋되기 전의 이전 값과 새 값.
DynoTable에서 항목의 스테이징된 변경을 검토하는 모습 — 업데이트가 커밋되기 전의 이전 값과 새 값.

함정과 다음 단계

  • 변경사항을 읽으려고 GetItem-그런 다음 글을 쓰지 마십시오 — 이는 왕복 여행이자 경주입니다. ReturnValues을 사용하세요.
  • UPDATED_*는 터치된 속성만 반환합니다 — 전체 항목이 필요한 경우 다음을 사용합니다. ALL_*.
  • PutItem/DeleteItem는 새 값을 반환할 수 없습니다NONE/ALL_OLD만 반환됩니다.
  • ReturnValues은 조건을 대체하지 않습니다 — 쓰기를 _보호_하려면, condition expression; 다시 읽어보려면 효과가 있으면 ReturnValues를 사용하세요. 그들은 작곡합니다.
  • 관련: update expressions, atomic counters.

두 번의 호출을 스크립팅하지 않고 편집하고 이전/이후를 확인하고 싶으십니까? Download DynoTable 항목을 직접 편집하세요.

UPDATED_NEW을 갖는 원자 계수기

인벤토리 시스템은 쓰기마다 version 또는 stock 필드를 증가시킵니다. 는 패턴은 ADD stock :incReturnValues: 업데이트_신규:

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

전체 항목이 아닌 변경된 속성 맵만 받습니다. 항목이 크지만 발신자에게 새 카운터가 필요합니다. 감사 추적을 위해 변경하기 전에 모든 필드를 캡처하려면 ALL_OLD로 전환하세요.

항목 크기에 따라 스틸 청구서가 UpdateItem로 표시됩니다. ReturnValues는 그렇습니다 별도의 읽기 요금을 추가하지 않음 — DynamoDB는 이미 항목을 로드하여 업데이트.

용량 참고

속성 반환은 쓰기 자체의 WCU 비용을 두 배로 늘리지 않습니다. 당신은 지불 AWS별 업데이트 전후의 항목 크기를 기준으로 쓰기에 대해 응답 페이로드에 나타나는 속성 수와 관계없이 규칙.

GetItem 다음 UpdateItem로 이전 값을 기록하고 싶다면, 읽기와 쓰기에 대한 비용을 지불했습니다. 업데이트 시 ReturnValues: ALL_OLD가 제거됩니다. 전체 읽기 — 2KB 항목에 대해 초당 500회 업데이트로 대략적으로 절약됩니다. 초당 250개의 최종 일관성 RCU.

조건식으로 작성

ReturnValuescondition expressions 에 작성하세요 같은 전화. 예: 캡 아래에서만 retryCount를 증가시키고, 새 카운트:

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

조건이 실패하면 DynamoDB는 ConditionalCheckFailedException을 반환하고 속성 페이로드 없음 — 비어 있는 성공적인 업데이트와는 다릅니다. UPDATED_NEW 아무것도 변하지 않았을 때.

expression builder을 사용하여 UpdateExpression, 조건 및 정렬된 값이 함께 매핑됩니다.

결정 가이드

당신은...설정작업
아무것도 돌아오지NONE넣기, 업데이트, 삭제
덮어쓰기/삭제 전 전체 항목ALL_OLD넣기, 업데이트, 삭제
이전에 변경된 필드만UPDATED_OLD업데이트
패치 후 전체 항목ALL_NEW업데이트
이후 변경된 필드만UPDATED_NEW업데이트

삭제하고 넣기

DeleteItemReturnValues: ALL_OLD는 "팝 앤 리턴"을 구현하는 방법입니다. 대기열 항목의 의미 — 삭제된 행은 Attributes에 다시 나타납니다. 있다 항목이 더 이상 존재하지 않기 때문에 삭제 시 ALL_NEW이 없습니다.

PutItemALL_OLD는 기존 항목을 덮어쓸 때 이전 항목을 반환합니다. 키 - 스왑 작업 흐름에 유용합니다. 키가 존재하지 않으면 응답이 생략됩니다. Attributes.

DynoTable에서 확인

항목 편집기에서 속성 변경 준비: 검토 창에 이전 및 새 항목이 표시됩니다. 커밋 전에 나란히 값 — 동일한 정보 UPDATED_OLDUPDATED_NEW은 스크립트를 작성하지 않고 반환됩니다. 커밋 후 행을 복사합니다. 그리드의 내보내기 작업을 통해 테스트 픽스처에 대한 JSON으로.

업데이트됨