アプリケーションでクラスを使用するのは、TransactionScope
いくつかの操作を自然にトランザクションで実行する必要があるためです (すべてが成功するか、まったく成功しないかのどちらかです)。
IEnlistmentNotification
この操作はデータベース関連だけではないため、インターフェイスを実装することで、ディスクおよびシステム サービス操作 (トランザクション ファイルの移動やサービスの停止など) の独自のトランザクション動作を定義しました。間違いなく問題なく動作しますが、これらすべてを 1 つのアプリケーションにまとめると、予期しない結果が得られました。
次の状況を想像してください
using(var ts = ...)
{
TxServiceManager.StopServices(services);
TxFileManager.MoveFiles(files);
DbManager.RunChangeScripts(scripts);
TxServiceManager.StartServices(services);
ts.Complete();
}
すべての操作をロールバックする必要がある状況になるまで、かなりうまくいきました。サービスの開始時に発生し、トランザクションスコープが
- 開始できたサービスを停止する
- データベースをロールバックする
- ファイルを復元する
- サービスを開始する
しかし、何だと思いますか?コード リストの最初の操作から簡単に開始できます。これはサービスを停止するサービスであり、もちろんサービスを開始することでロールバックします。よし、サービスは実行中ですが、これらのサービスが実行中に使用するファイルを上書きできないため、2 回目の操作で失敗します。
ロールバックが最後の操作ではなく最初の操作から始まるのはどうしてですか?