1

データ入力 ASP.NET アプリケーションがあります。1 回の完全なデータ入力中に、多くのトランザクションが発生します。ユーザーがデータ入力を放棄したい場合、私が記録しているすべてのトランザクションをロールバックできるように、これらすべてのトランザクションを追跡したいと思います。

SQL 2008、フレームワークのバージョンは 4.0 で、c# を使用しています。

4

4 に答える 4

5

これは、Web 開発に不慣れな人にとって、常に学ぶのが難しい教訓です。しかし、ここにあります:

各ラウンドトリップ Web リクエストは、独立したスタンドアロンの実行スレッドです。

つまり、簡単に言えば、ページ要求を送信する (ボタンをクリックする、新しいページに移動する、ページを更新する) たびに、前のスレッドとは異なるスレッドで実行できます。さらに、同じスレッドを 2 回取得したとしても、2 つの要求の間の時間内に、スレッドによって他のいくつかの Web 要求が処理されている可能性があります。

これにより、単純なトランザクションを複数の Web リクエストにまたがることは事実上不可能になります。

心に留めておくべきもう 1 つの概念を次に示します。

トランザクションは、インタラクティブな操作ではなく、バッチ操作を目的としています。

これが意味することは、トランザクションは短命であり、すべての操作がアトミックであり、すべてが完了するかすべてが失敗することを意図した、順次 (または同時に) 実行されるいくつかの操作を包含することを意味します。通常、トランザクションは長期間存続するようには設計されていません (ユーザーがさまざまなアクションを対話的に決定するのを待つことを意味します)。

Web アプリはデスクトップ アプリではありません。 彼らは彼らのように機能しません。Web アプリケーションを行うときは、考え方を変える必要があります。そして、学ぶべき最大の教訓は、各リクエストが独立した実行単位であることです。

さて、上で「単純なトランザクション」と言いましたが、これは軽量またはローカル トランザクションとしても知られています。分散トランザクションと呼ばれるものもあり、それらを使用するには分散トランザクション コーディネーターが必要です。MSDTC はかなり一般的に使用されます。ただし、DT のパフォーマンスは LWT よりもはるかに遅くなります。また、DTC を使用するようにインフラストラクチャをセットアップする必要があります。

DTC を使用して、トランザクションを Web リクエストにまたがることができます。これは、Distribute Transaction に「登録」し、このトランザクション ID をリクエスト間で共有することによって行われます。しかし、これはセットアップと対処に多くの作業が必要であり、エラーが発生しやすい状況が数多くあります。他の選択肢があるなら、それはあなたがしたいことではありません。

一般に、一時テーブルまたは複数のテーブルにデータを追加し、最終的な保存が完了したら、そのデータを永続テーブルに転送することをお勧めします。もう 1 つのオプションは、何らかの状態 (ViewState や Session を使用するなど) を維持して、変更を追跡することです。

これを行う一般的な方法の 1 つは、JavaScript を使用してクライアント側で操作を実行し、完了したらすべての変更をサーバーに送信することです。ただし、別のページに移動する必要がある場合、これを実装するのは困難です。

于 2012-10-13T06:18:02.000 に答える
1

あなたの質問から、ユーザーがトランザクションをロールバックするオプションを実行すると、トランザクションが完了したように見えます。このような場合、DBMS のトランザクション ロールバック セマンティクスが利用できるかどうかは疑問です。したがって、次のようにアプリケーション層でそのようなセマンティクスを提供します。

  1. データベースで実行できるアトミック操作は、Commandオブジェクトにカプセル化する必要があります。各コマンドは、execute メソッドによって実行されたアクションを元に戻す undo メソッドを実装します。
  2. 各トランザクションには、その一部として実行されたコマンドのリストが含まれます。トランザクションは、将来のさらなる操作のためにそのまま保持されます。
  3. ユーザーには、ロールバックされる可能性のあるこれらのトランザクションを表示する方法が提供されます。ユーザーがロールバックするトランザクションを選択すると、そのようなトランザクションに対応するコマンドのリストが取得され、それらすべてのコマンド オブジェクトに対して undo メソッドが呼び出されます。

HTH。

于 2012-10-13T06:16:59.420 に答える
0

1 回の保存操作中にトランザクションを管理するだけの場合は、 を使用しますTransactionScope。しかし、そうではないようです。

ユーザーが以前の保存操作を破棄したい場合はn、アイテムがドラフト形式で存在する可能性があることを示唆しています。ワーキング ドラフトは 1 つまたは多数存在する可能性があります。その後、暗黙的または明示的にドラフトを最終バージョンに昇格させる方法が必要です。電子メール プログラムが下書きを保存する方法を考えてみてください。実際にメッセージを送信するわけではなく、いつでも破棄でき、後で思い出すことができます。メッセージを送信すると、「トランザクションをコミット」したことになります。

特定のバージョンにロールバックするためのユーザー インターフェイスを追加することもできます。

これはかなりの作業量になりますが、同じアイテムの複数のコピーを保存して管理する意思がある場合は、それを達成できます。

ドラフトであることを示すステータス フラグを使用して、同じデータのコピーを同じスキーマに保存するか、別のテーブルに中間形式でデータを保存することができます。同じ構造を使用できるという点で、最初のアプローチをお勧めします。

于 2012-10-13T06:26:43.730 に答える
0

それらを一時テーブルに保存し、それらのレコードを「後の段階で」元のテーブルに移動することもできます..

于 2012-10-13T06:31:31.367 に答える