0

「ソフト」トランザクションとは、一部の DB での永続性を含まず、論理オブジェクトの変更だけを意味します。これが話です。

プレーンな Java アプリケーション、フレームワークなし、おそらく多くのスレッド。

  1. オブジェクトObは、別のスレッドでdoSomething()を開始します。doSomething() 内で、このオブジェクトのメンバーと (おそらく) 他のオブジェクトが変更されます。
  2. Ob のスレッドが何らかのイベント ハンドラによって中断されました。誰かが Ob にdoSomething()の代わりに doSomethingElse() を求めている!
  3. Ob は doSomething() を完了し、スレッドが中断されたかどうかを確認します。はいの場合、私は彼に次のことをお願いします:
    a) 完全に元に戻す (ロールバック) doSomething()、
    b) doSomethingElse()

doSomething() で行われた特定の変更を追跡する必要はありません。また、オブジェクトごとにさまざまな doSomething メソッドを使用できるためです。私は特定のフレームワークを使用しておらず、「軽量」に保ちたいと思っています。

そのような動作を達成する方法はありますか?
よろしくお願いします!

4

3 に答える 3

4

Memento Patternを見ることができます:

memento パターンは、オブジェクトを以前の状態に復元する (ロールバックによる元に戻す) 機能を提供するソフトウェア設計パターンです。

于 2013-04-09T12:29:19.890 に答える
2

はい、そのような機能は可能であり、ORM フレームワークやサーブレット コンテナーなどでよく使用されます。ORM フレームワークは、ほとんどの場合、事前入力された Java オブジェクトが格納されるエンティティ キャッシュのようなものを提供します。これらのオブジェクトへの変更は、DB トランザクションと同期する必要があります。一部のサーブレット コンテナーは、HTTP セッションへのトランザクション アクセスも提供します。たとえば、リクエスト中の変更はセッションのコピーに適用され、リクエストが成功した場合にのみ永続的に適用され、それ以外の場合は破棄されます。

一般に、このような機能は、トランザクションの開始時に状態のコピーを作成すること、トランザクション中にコピーを処理すること、およびトランザクションをコミットするときに永続的な状態を変更されたコピーに置き換えること、およびトランザクションがロールバックされた場合にコピーを破棄することに基づいています。同時変更をチェックしたり、さらには禁止したりするための追加機能が必要になる場合もあります。

Java にはオブジェクトのコピーを作成する「標準的な」方法がないため、自分でいくつかの作業を行う必要があり、いくつかの方法が考えられます。

  • を実装Cloneableしますが、 clone メソッドがデフォルトの浅いコピーではなく、オブジェクトの深いコピーを返すことを確認してください (アウトバウンド参照は、参照されたオブジェクトの実際のコピーを作成するのではなく、単に新しいオブジェクトに「移動」されます)。
  • シリアル化を使用します。オブジェクトがシリアライズ可能な場合、たとえば a にシリアライズしByteArrayOutputStream、オブジェクトを読み取ってコピーを取得できます。
  • 独自のリフレクション ベースのコピー機能を実装します。
于 2013-04-09T12:33:04.230 に答える