我应该如何处理DynamoDB中可能发生的冲突?

时间:2014-12-05 10:46:41

标签: amazon-web-services amazon-dynamodb

你和我都想参加一场音乐会,但只剩下一张票。我们都试图在同一时刻保留这张票。使用AWS SDK for PHP的PHP脚本运行以下updateItem API调用,该调用尝试更改"状态" "票#34;从0(可用)到1(暂停)。

        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并且“#34;拥有&#34;票证,第二个请求失败,因为&#34;预期&#34;状态为0将不存在。

我正在访问如果DynamoDB可用于此类用例,或者我需要坚持使用我的好关系数据库。这段代码有效,但我觉得我无法对此进行充分测试。我的问题:

  1. 这是用例的正确方法吗?
  2. 有没有人看过任何关于处理订单请求的DynamoDB文档?
  3. 如果 是正确的实施,是否有针对测试方案的建议?

1 个答案:

答案 0 :(得分:1)

DynamoDB使用乐观并发控制模式来处理您的用例。它被实现为“条件更新”。 使用条件更新时,仅当自读取后属性值未更改时,API才会写入项目。 如果它被更改,则会引发错误,由应用程序决定。

参见http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.ConditionalUpdate 详情。