너와 나 둘 다 콘서트에 가고 싶지만 단 하나의 티켓 만 남아있다. 우리는 동시에 그 티켓을 예약하려고 시도합니다. PHP 용 AWS SDK를 사용하는 PHP 스크립트는 "ticket"의 "상태"를 0 (사용 가능)에서 1 (대기 중)으로 변경하려고하는 다음 updateItem API 호출을 실행합니다.DynamoDB에서 충돌 가능성을 어떻게 처리해야합니까?
try {
$response = $ddb->updateItem(array(
"TableName" => "tickets",
"Key" => array(
"tn" => array("N" => $request["tn"])
),
"AttributeUpdates" => array(
// set ticket state (ts) = 1...
"ts" => array(
"Value" => array("N" => 1)
),
<snip - more fields updated here to "own" the ticket>
),
"Expected" => array(
"ts" => array(
// ...where ticket state (ts) = 0
"ComparisonOperator" => "EQ",
"AttributeValueList" => array(
array("N" => "0")
)
)
),
"ReturnValues" => "ALL_NEW"
));
} catch (Exception $e) {
$this->ErrorMessage(5, "Call to ReserveTicket failed: " . $e->getMessage());
}
이상적으로 DynamoDB의이 순차적으로 1 상태를 뒤집어 "자신의"티켓, 두 번째 요청이 실패, 이길 네트워크를 통해 그것을 만들 수있는 우리의 첫 번째를 처리하는 것 때문에 "예상" 상태 0은 존재하지 않습니다.
DynamoDB가이 유형의 사용 사례에 사용하도록 + 확인되었거나 양호한 관계형 데이터베이스를 사용해야하는 경우 액세스합니다. 이 코드는 작동하지만, 적절하게 테스트 할 수 있다고는 생각하지 않습니다. 내 질문 :
- 이 사용 사례에 대한 올바른 접근 방식입니까?
- 주문 요청에 대한 대화를 처리하는 DynamoDB 설명서를 본 사람이 있습니까?
- 이 인 경우 올바른 시험 실시를위한 제안 사항이 있습니까?
요청이 작동하려면 요청이 순차적이어야합니다. 맞습니까? 이것은 동시 쓰기의 가능성을 허용하지 않습니다. 그것이 내가 매달린 곳입니다. updateItem 요청이 동시에 도착하면 예제의 티켓 상태는 두 요청에 대해 모두 0입니다. –
테이블 잠금이 없으면이 사용 사례를 100 % 해결할 수있는 방법을 모르겠습니다. –
아니요.이 메커니즘은 다중 스레드 환경에서 작동하도록 설계되었습니다. 조건부 쓰기 작업은 DynamoDB 측에서 수행되며 원자 적입니다. 조건부 기록은 멱등 원이므로 동일한 조건부 쓰기 요청을 여러 번 보낼 수 있지만 DynamoDB가 지정된 업데이트를 처음 수행 한 후에는 항목에 더 이상 영향을 미치지 않습니다. " –