你和我都想参加一场音乐会,但只剩下一张票。我们都试图在同一时刻保留这张票。使用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可用于此类用例,或者我需要坚持使用我的好关系数据库。这段代码有效,但我觉得我无法对此进行充分测试。我的问题:
答案 0 :(得分:1)
DynamoDB使用乐观并发控制模式来处理您的用例。它被实现为“条件更新”。 使用条件更新时,仅当自读取后属性值未更改时,API才会写入项目。 如果它被更改,则会引发错误,由应用程序决定。