2014-12-05 4 views
0

너와 나 둘 다 콘서트에 가고 싶지만 단 하나의 티켓 만 남아있다. 우리는 동시에 그 티켓을 예약하려고 시도합니다. 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가이 유형의 사용 사례에 사용하도록 + 확인되었거나 양호한 관계형 데이터베이스를 사용해야하는 경우 액세스합니다. 이 코드는 작동하지만, 적절하게 테스트 할 수 있다고는 생각하지 않습니다. 내 질문 :

  1. 이 사용 사례에 대한 올바른 접근 방식입니까?
  2. 주문 요청에 대한 대화를 처리하는 DynamoDB 설명서를 본 사람이 있습니까?
  3. 인 경우 올바른 시험 실시를위한 제안 사항이 있습니까?

답변

1

DynamoDB는 낙관적 동시성 제어 패턴을 사용하여 사용 사례를 처리합니다. 그것은 "조건부 업데이트"로 구현됩니다. 조건부 업데이트를 사용할 때 API는 속성 값이 읽기 이후 변경되지 않은 경우에만 항목을 씁니다. 변경된 경우 오류가 발생하고 결정을 내리는 것은 응용 프로그램의 책임입니다.

자세한 내용은 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.ConditionalUpdate을 참조하십시오.

+0

요청이 작동하려면 요청이 순차적이어야합니다. 맞습니까? 이것은 동시 쓰기의 가능성을 허용하지 않습니다. 그것이 내가 매달린 곳입니다. updateItem 요청이 동시에 도착하면 예제의 티켓 상태는 두 요청에 대해 모두 0입니다. –

+0

테이블 잠금이 없으면이 사용 사례를 100 % 해결할 수있는 방법을 모르겠습니다. –

+0

아니요.이 메커니즘은 다중 스레드 환경에서 작동하도록 설계되었습니다. 조건부 쓰기 작업은 DynamoDB 측에서 수행되며 원자 적입니다. 조건부 기록은 멱등 원이므로 동일한 조건부 쓰기 요청을 여러 번 보낼 수 있지만 DynamoDB가 지정된 업데이트를 처음 수행 한 후에는 항목에 더 이상 영향을 미치지 않습니다. " –

관련 문제