6

各トランザクションに対してユーザー クレジット/カウント情報を更新しようとしています。1 秒あたり 2/4 を超えるトランザクションにヒットした場合、以下の更新ではカウント/ユーザー クレジット情報が更新されません。

基本的に2つの問題。

  1. いいえ、エラーメッセージで更新が行われないことがあります。
  2. エラー メッセージで失敗する更新: 412: 失敗: コード: 412 値: 前提条件 失敗した詳細 (ある場合): UpdateConditionNotSatisfied 要求で指定された更新条件が満たされませんでした。RequestId:1beb3fa9-9ad2-46f7-b8ee-af3a09300db7 時刻:2013-06-09T16:12:17.6797130Z .

SMS APIに Azure を使用して、RDMBS から NoSQL への移行のプロトタイプを作成しています。なぜそのようなことが起こるのか分かりません。

以下にコードを貼り付けます

public function update_credit_to_azure_table () {
  // Create table REST proxy.
  $tableRestProxy = ServicesBuilder::getInstance()
    ->createTableService($this->connectionString);

  $result = $tableRestProxy->getEntity("tblapilogin",  $this->apiusr , $this->apiusr);
  $entity = $result->getEntity();

  $new_api_balance = $this->global_api_credit - $this->credittodeduct;
  $credit_used = $this->api_credit_used + $this->credittodeduct;

  $entity->setPropertyValue("global_api_credit", $new_api_balance); //Update Balance.
  $entity->setPropertyValue("api_credit_used", $credit_used); //credit used Updated .

  try {
    $tableRestProxy->updateEntity("tblapilogin", $entity);

    echo "<br>New Blance is: " . $new_api_balance;
    echo "<br>credit_used  is: " . $credit_used;
  }
  catch(ServiceException $e) {
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
  }
}

オプティミスティック コンカレンシーを使用した update 関数は、ここでの主要なテストのようなものです。

4

2 に答える 2

0

私は PHP の専門家ではありませんが、 のソース コードを見ると、関数は常に の使用を強制することがGithubわかりました。つまり、関数は条件付き更新を強制します。updateEntityETag

public function updateEntity($table, $entity, $options = null)
    {
        return $this->_putOrMergeEntityImpl(
            $table,
            $entity,
            Resources::HTTP_PUT,
            true, 
            $options
        );
    }

ここのドキュメントに基づいています:

エンティティの ETag が更新要求で指定されたものと異なる場合、更新操作はステータス コード 412 (Precondition Failed) で失敗します。このエラーは、取得後にエンティティがサーバー上で変更されたことを示します。このエラーを解決するには、エンティティを再度取得して、要求を再発行します。

無条件の更新操作を強制するには、要求の If-Match ヘッダーの値をワイルドカード文字 (*) に設定します。この値を操作に渡すと、既定の楽観的同時実行がオーバーライドされ、ETag 値の不一致が無視されます。

Etag 値が一致しない場合、412 エラーが発生します。

エンティティが存在しない場合はエンティティが作成され、そうでない場合は更新されるため、insertOrReplaceEntity操作の代わりに操作を使用することをお勧めします。updateEntityまたコードを見ると、これは を利用していませんETag

public function insertOrReplaceEntity($table, $entity, $options = null)
    {
        return $this->_putOrMergeEntityImpl(
            $table,
            $entity,
            Resources::HTTP_PUT,
            false, 
            $options
        );
    }

両方の関数の 4 番目のパラメーターに注目してください。これは、ETag の使用を強制するものです。ではupdateEntityに設定されtrueinsertOrReplaceEntityでは に設定されfalseます。

于 2013-06-09T18:51:49.030 に答える