2

次のような状況があります。

1 つのビジネス エンティティ (BE) は、2 つのスレッドによって非同期に提供される 2 つの部分で構成されます。例: BE にはフィールド id と A、B、C があり、すべてデータベース内の 1 つのテーブルにあります。ID は、エンティティがデータベースに格納されるときにシーケンスによって生成されます。B は一意のフィールドであり、データベースには制約があります。プロセス 1 はフィールド A と B を提供します。プロセス 2 はフィールド B と C を提供します。したがって、両方のプロセスが終了すると、すべての列が入力されたテーブルに 1 つの行が表示されます。

これを機能させる良い方法は何ですか?

現在行われていること:

各プロセスでは、最初にテーブルからすべての値を選択します。ここで、列 B の値は現在のものです。(存在する場合 - これは、他のプロセスが既にその一部を保存していることを意味します)。何かある場合は、欠落している列で強化され、永続化されます。何もない場合は、持っているものを保持するだけです。ただし、これがすべて完了している間に、他のプロセスがその仕事を終了した可能性があり、エンティティを永続化すると ConstraintViolationException が発生し、hibernate がトランザクションをロールバックするようにマークします。そして、欠落している列はまだ欠落しています。

4

2 に答える 2

0

最初に、競合を処理する方法を決定する必要があります。これについては、次の質問に答えてください。

プロセス 2 の実行中にプロセス 1 がエンティティを変更した場合、2 の結果はまだ有効ですか? それとも再放送すべき?

プロセス 1 がフィールド B を更新する場合、プロセス 2 の実行中にプロセス 2 がフィールド B を上書きする必要がありますか? または単にプロセス1の値を保持しますか?

もちろん、質問も 1 と 2 を入れ替えて回答する必要があります。

元のエンティティを取得し、新しい変更されたエンティティ + 元のエンティティを生成する方法でプロセスを実装すると、これらすべての結果が追加される単一のキューと、これらの変更をデータベースに適用する単一のプロセスを持つことができます。 .

特定のシナリオでは、より単純なアプローチが可能かもしれませんが、これは、質問で説明した非常に一般的なケースで推奨されるアプローチです。

于 2012-10-26T12:33:03.527 に答える
-1

私はこのようにします

  • スレッドを起動する前にエンティティをロードまたは作成する
  • スレッドを起動し、それぞれに渡します
  • 両方のスレッドで更新します
  • 両方が完了したら、dbに保存します
于 2012-10-26T11:48:19.557 に答える