ユーザーがアップロードしたファイルをディスクに保存し、ファイル名をデータベースに保存するだけです。レコードが挿入され、ファイルがディスクに保存された場合にのみコミットするようにコードを書きたいと思います。DBにレコードが作成されたが、権限の問題などでファイルを保存できなかった場合、トランザクション全体をロールバックしたい。明らかに、これを使用して行うことはできませんSqlTransaction
この種の datda の整合性をどのように確保すればよいでしょうか?
ユーザーがアップロードしたファイルをディスクに保存し、ファイル名をデータベースに保存するだけです。レコードが挿入され、ファイルがディスクに保存された場合にのみコミットするようにコードを書きたいと思います。DBにレコードが作成されたが、権限の問題などでファイルを保存できなかった場合、トランザクション全体をロールバックしたい。明らかに、これを使用して行うことはできませんSqlTransaction
この種の datda の整合性をどのように確保すればよいでしょうか?
私は通常、何らかの管理が必要な非トランザクションタスク(または、あなたの場合、トランザクションに含めるのが難しいもの)に対して次のいずれかを実行します。
1)非トランザクションタスクを最後に実行します。失敗した場合、トランザクションはロールバックされるため、心配する必要はありません。例:-電子メールが送信されない-ファイルが保存されない
2)一種の「2フェーズコミット」を実行するプロセス/サガを使用します。おそらく、ファイル保存タスクを検証する必要があることを示すテーブル内のトランザクション外のエントリです。次に、トランザクションの「実際の」ビットを試してください(レコードの保存、ファイルの保存)。次に、別のスケジュールされた/アドホックサービスが、タスクが完了したかどうかを確認し、完了しなかった場合はクリーンアップできます。
3)(2)の方針に沿って:最初にデータを一時的な状態で保存します(多かれ少なかれ先行書き込みログが機能する方法)。状態に問題がない場合は、データがすべて揃っていることを確認し、続行して記録を完了としてマークするか、永続的なホームに移動できます。別のスケジュールされた/アドホックタスクは、期限切れになった場合に一時データをクリーンアップできます。
Windows Vista 以降では、必要に応じてファイルシステム操作をトランザクションに登録できるトランザクション NTFS がサポートされています。残念ながら、.NET Framework はこの機能を直接サポートしていないため、P/Invoke を介してアンマネージ API を直接呼び出すか、Transactional NTFS (TxF) .NET などのサードパーティ マネージ ラッパー ライブラリを利用する必要があります。
私はこれを自分で使用したことはありませんが、いくつかの検索を行った後、これが最も使いやすいようです。