2

Windows Azure Web サイト (IISNode) で node.js アプリケーションを開発しており、node.js 用の Azure SDK モジュールをインストールしました。質問は、テーブル ストレージで etag またはタイムスタンプ フィールドを使用する方法です。

「私」が何かをするのは問題ですか?

if (entities[0].Timestamp == newEntity.Timestamp)
    // commit this update because we are dealing with the latest copy of this entity
else
    // oops! one of the entities is newer than the other, better not save it

または、 tableService.updateEntity( ... によって返されたエラーをリッスンする必要がありますか?

助けやアドバイスをいただければ幸いです

4

2 に答える 2

4

ETag は、更新中のオプティミスティック コンカレンシーに使用されます。ETag は、エンティティを取得すると自動的に設定され、クエリ対象のエンティティを更新すると自動的にアップロードされます。エンティティがその間に別のスレッドによって更新されている場合、更新は失敗します。updateEntity メソッドにはオプションのパラメーター checkEtag があり、別のスレッドがレコードを更新したかどうかに関係なく更新が成功することを指定できるようにすることで、この動作を変更するために使用できます。これにより、オプティミスティック コンカレンシーがオーバーライドされます。

Windows Azure ストレージ サービス REST API は、Windows Azure ストレージへの決定的なインターフェイスであり、htis は、サービスの API 機能を理解したい場合に参照するドキュメントです。一般に、ETag について説明しているドキュメントはこちらです。

于 2012-09-13T05:27:01.410 に答える
3

Neil が言及したように、テーブル サービスに同時実行関連のものを処理させることをお勧めします。

クライアント ライブラリを使用してテーブル サービスからエンティティを取得すると、ライブラリは、エンティティに関連付けられた ETag (エンティティに対するサービスからの応答に存在する) を EntityDescriptior インスタンスに格納します (EntityDescriptor は、ライブラリによって維持されるオブジェクトです)。コンテキスト内の各エンティティ インスタンス)

エンティティを更新するリクエストを送信すると、sdk は、HTTP リクエストの本文を XML にシリアル化されたエンティティとして、リクエストの ETag ヘッダーをエンティティに対応するエンティティ記述子に格納された ETag 値として準備します。

テーブル サービスは、エンティティ インスタンスを更新するためのこの要求を受信すると、要求内の ETag が、テーブル ストレージ内のエンティティに現在関連付けられている ETag と一致するかどうかを確認します (サービスに格納されているエンティティに関連付けられている ETag は、他の更新が発生した場合に変更されます)。更新リクエストを受信する前に)、一致しない場合、サービスは、応答で HTTP ステータス コードを 412 または 409 に設定することにより、前提条件の失敗/競合エラーを返します。

bool done = true;
while (!done)
{
    Stat statistics = _context.Execute<Stat>(new Uri("https://management.core.windows.net/<subscription-id>/services/storageservices/StatEntity?RowKey=..&PartitionKey=..").FirstOrDefault();

    try
    {
        // TODO: Update the entity, e.g. statistics.ReadCount++
        _context.UpdateObject(statistics);
        _context.SaveChanges();
        // success
        break;
    }
    catch (DataServiceRequestException exception)
    {
        var response = exception.Response.FirstOrDefault();
        if (response != null && (response.StatusCode == 412 || response.StatusCode == 409))
        {
            // Concurrency Exception - Entity Updated in-between
            // by another thread, Fetch the latest _stat entity and repeat operation
        }
        else
        {
            // log it and come out of while loop
            break;
        }
    }
    catch (Exception)
    {
        // log it and come out of while loop
        break;
    }
}
于 2012-09-13T05:37:39.883 に答える