2011-12-26 19 views
0

空白のテーブルストレージにあります。更新または挿入後に新しいタイムスタンプ値を取得する方法はありますか?私は、分散トランザクションをサポートするためにテーブルストレージを取得するための3フェーズコミットプロトコルを作成しており、同じエンティティへの複数の書き込みを行います。したがって、操作命令は次のようになります。Read EntityWrite Entity (Lock Item)Write Entity (Commit new values)。アイテムのロック操作後に新しいタイムスタンプを取得したいので、新しい値のコミット操作を行う前にアイテムを再度読み込む必要はありません。では、savechanges操作後に効率的に新しいタイムスタンプ値を取得する方法を知っていますか?挿入/更新後にタイムスタンプを取得

答えて

1

私は特別な/特別なことをする必要はないと思います。あなたがあなたのエンティティを読むと、そのためのEtagが得られます。そのエンティティを保存すると(someLock = trueに設定されます)、保存したものは、読み取り後に他の誰もエンティティを更新していない場合にのみ成功します。したがってあなたはあなたがロックを持っていることを知っています。そして、あなたはあなたが好きなように2度目の書き込みをすることができます。

0

私はそれが可能であるとは思わない。自分のタイムスタンプやGUIDを使ってエントリをマークします。

+0

私は2つの書き込みを次々にやり遂げようとしています。最初はロックし、次回はコミットします。私は途中で読んでいなくてもこれをしたいと思っています。余分なフィールドは余分な読み取りを防ぐのに役立つものではありません。助言がありますか? – RyanFishman

+0

残念ながら、タイムスタンプ比較を行って他の人が同じエンティティに書き込むのを防ぐことを試みていると思っていました。なぜあなたはそれが挿入された後にタイムスタンプを知る必要があるのですか? – Igorek

+0

Azure Table Storageの独自の分散トランザクションメソッドを実装しています。なぜなら、テーブルストレージはそれをネイティブにサポートしていないからです(なぜそうではないのでしょうか?)。私は同じエンティティに2回の書き込みを実行しています。最初の書き込みはロックですが、基本的にはIsLockedというプロパティ呼び出しをtrueに設定します。それが正常に成功した場合、他のすべてのロールは、現在他のロールがロックされているため、そのエレメントに書き込まないことを認識します。ロックを取得して、分散トランザクションに必要なすべての行をロックしたら、エンティティへの変更を進めることができます。 – RyanFishman

0

Update REST API callに戻ってもらえたら、応答が生成された時間が返されます。レコードのタイムスタンプとまったく同じではないかもしれませんが、近いと確信しています。

+0

正確ではない場合、オプティミスティックな並行性のために2番目の更新が失敗することはありません。オプティミスティックな並行性も回避できますか?ロックを取得してからは、他のプロセスがエンティティを更新しようとしないことを保証できます。 – RyanFishman

+0

[OK]を、このような値を更新するのではなく、テーブル記憶域の楽観的同時実行を無視するために – RyanFishman

0

あなたのAzureテーブルをハックする必要があるかもしれません。ドライバ

たとえば、Azure python lib(TableStorage)では、タイムスタンプは単純にスキップされます。

# exclude the Timestamp since it is auto added by azure when 
    # inserting entity. We don't want this to mix with real properties 
    if name in ['Timestamp']: 
     continue 
関連する問題