.NET WinForms アプリがあります。その中で、データベースで何もしない 3 つの関数を実行します。関数のアクションが失敗した場合は、ロールバックしたいだけです。
だから私は単純な .NET トランザクションの例を探していますが、私がグーグルで調べたものはすべて、SQL トランザクション処理を使用しているようです。
助けてくれてありがとう。
.NET WinForms アプリがあります。その中で、データベースで何もしない 3 つの関数を実行します。関数のアクションが失敗した場合は、ロールバックしたいだけです。
だから私は単純な .NET トランザクションの例を探していますが、私がグーグルで調べたものはすべて、SQL トランザクション処理を使用しているようです。
助けてくれてありがとう。
トランザクションが失敗した場合にロールバックする操作の種類によって異なります。通常、1 つまたは複数のリソース マネージャーを実装し、それらをトランザクションに登録して機能させる必要があります。
それは非常に重要な作業であり、ピンセットが必要な大ハンマーかもしれません。つまり、おそらくそれを試みるべきではありません (検討する価値がある Memento パターンについて言及しているコメンターに同意します)。要するに、メソッド呼び出しを単純に「ロールバック」する方法はありません。これは、変更がさまざまな種類のリソース (メモリ、ファイルシステム、Web サービスなど) に関係する可能性があるためです。
トランザクションは、メソッドによって実行された変更だけをロールバックする必要があるのか 、それともメソッドによって呼び出された他のメソッドによって実行された変更もロールバックしようとする必要があるのか など、あらゆる種類の論理的な困難を抱えていると思います. トランザクションのACIDプロパティをどのように適用しますか? 基本的に、ダーティ リードなどを防ぐために、トランザクション中に他のスレッドが同じメモリ位置にアクセスするのを停止する必要があります。リレーショナル データベースは、どのトランザクションがいつ、どのデータにアクセスできるかを厳密に制御できるため、これを行うことができます。一方、単一のプロセスでは、すべてのスレッドが同じアドレス空間を共有している場合は、はるかに困難です。
メモリ操作を逆にすることにのみ関心がある場合は、ある時点で MS が .NET Framework の一部としてソフトウェア トランザクション メモリ (STM) を含めることを検討していたことを知っておく必要がありますが、それらの計画は困難のために断念されました。ただし、同様の機能を実装しようとした非常に古いMSDN の記事Transactional<T>
があります (メモリ内の値へのトランザクション アクセスの型を提供します)。ただし、これが実際のコードで使用されているのを見たことはありません。
興味深い研究プロジェクトになるかもしれません。それ以外については、肝心なのはそれをしないことです。;-)
別のチュートリアルであるIEDtiableObjectの実装を見ることができます。