11

ファイルを Azure Blob Storage に保存したいと考えています。ここまでは順調ですね。ファイルに関する追加のメタデータも保存したいと思います。そのために、私は Azure SQL データベースを使用します (そのため、Blob Storage 上のファイルを簡単にクエリできます)。

そのため、新しいファイルをストアに追加するときは、ブロブとメタデータが正常に書き込まれたことを確認したいと思います。そのため、トランザクションコンテキストのようなものを使用することが頭に浮かびます。

BLOB ストレージと SQL ストレージを使用して、このようなトランザクション コンテキストを作成する方法はありますか?

4

2 に答える 2

8

私の知る限り、これを行う組み込みのものはありません。これは自分で管理する必要があります。最も単純なシナリオは、最初に BLOB を保存してから、データベース レコードを追加することです。データベースは必要に応じてインデックスとして機能するため、データベース レコードが保存されるまで、Blob は基本的にコードから見えません。

より複雑なオプションは、独自のコミット ロジックを実装することです。データベースの挿入を処理し (たとえば、レコードのフラグを 0 に設定)、Blob を保存し、成功した場合はデータベースのフラグを 1 に設定します。

メタデータを Azure テーブルに保存することもできますが、多数のレコードがある場合、Azure テーブルでの検索は大幅に遅くなる可能性があります。ほとんどの場合、SQL データベースでの検索は高速になります。

どちらのアプローチを選択するかは、目的によって異なりますが、最初のオプションが最も簡単だと思います。

于 2012-10-10T13:46:31.803 に答える
5

存在する BLOB は無害ですが、存在しない BLOB を指すデータベース レコードは問題になります。したがって、次のロジックを使用してトランザクションを実装します。

作成時... 最初に BLOB を追加してから、データベース レコードを作成します。BLOB のアップロードが失敗した場合は、そのまま戻ります。BLOB のアップロードは成功したが、データベース レコードが失敗した場合は、BLOB を削除して戻ります。ポイントは、BLOB のアップロードが成功するまで、データベース レコードを作成したくないということです。また、データベース レコードを更新できなかった場合は、BLOB をクリーンアップする必要があります。BLOB のクリーンアップが失敗した場合は、1 時間以上前に作成された参照されていない BLOB を定期的にクリーンアップするサービスを実行して、アップロードとデータベース レコードの作成の間に削除しようとしないようにするだけです。

削除時... 最初にデータベース レコードを削除します。それが失敗した場合は、戻ってください。BLOB とデータベース レコードの両方がまだそこにあります。データベース レコードが正常に削除された場合、BLOB はそこに残っていても何も問題はありません。そのため、すぐに削除するか、後で処理するためにクリーンアップ サービスに任せることができます。

于 2016-10-28T18:58:56.860 に答える