2011-08-12 40 views
6

これまでデスクトップクライアントアプリケーションでTransactionScopeを使用して、不完全な複数ステップトランザクションをロールバックしました。このアプローチは、Webアプリケーションではうまくいかないようです。複数のHTTPリクエストにまたがる複数ステップデータベーストランザクション

プロセス全体が完了していない場合、複数ページにわたる複数のステップをロールバックする方法を提案できますか? (ブラウザがクラッシュしたり、途中でブラウザを閉じるなど)

確かに、ある種の一時テーブルに書き込んで、最終レコードを単一のトランザクションで実テーブルに転送することはできますが、競合状態のリスク。私はトランザクションを開始し、いくつかのページを提供したい、各ページはトランザクションの一部をテーブルに書き込んだり、コミットしてトランザクションを完了したり、トランザクションが完了していなければロールバックしたりする。セッションは終了します。

私は正しい方法を考えていませんか?提案?

私はMVC 3、EF 4.1、Ninjectを使用しているので、どのように解決策に影響するのか分かりませんが、私はその情報を含めると思っていました。

答えて

8

複数のページにわたるデータベーストランザクション/ TransactionScopeはありません。そんなことをやろうとしてもひどく間違っています。

あなたが問題を解決するには、2つのオプションがあります。

  • 使用Session

    ストアセッションでのデータとユーザーがすべてのステップを完了し、保存を確認した場合にのみ、それをデータベースに永続化。これは間違いなく必要なものです。]

  • ワークフローの基盤と長期間のトランザクションを使用します。

    長時間実行されるトランザクションは、データベーストランザクションではなく、長時間にわたるトランザクションのロールバックを手動で実装する必要がある完全なカスタムソリューションです。ワークフローを補償する必要があるかどうかをまだ検出する必要がありますが、これはソリューションには必要ありません。これは、複数のセッションに対して「トランザクション」が必要なソリューションです。

+0

これは、並行処理を手動で処理する必要があることを意味します。それは私のコード臭のように思える。 –

+0

Webアプリケーションで並行処理を手動で処理することは非常に一般的です。データベーストランザクションはできるだけ短くする必要があります。ほとんどの一般的なシナリオでは秒単位です。あなたがやりたいことは、数分間データベースに集中的にロックすることを意味します=あなたのアプリケーションはひどく悪い動作をします。 –

1

nservicebusまたはmasstransitの設定を見て、それらのSaga Faciliesを使用することがあります。

+0

私はサービスロケーションを行うIoCも使用しているため、サービスバスは冗長なようです。 –

+3

@ミステリ​​ーそれは意味をなさない。サービスバスはIOCとはまったく異なります。 Sagasは競合状態を解消し、非常に明示的な状態遷移(メッセージ)を許可します。しかし、あなたはたぶんテンポラリテーブルを使って離れていくことができます。 – Ryan

関連する問題