0

私はもっ​​と理論的な質問があります:データがデータベースに挿入されるとき?永続化後ですか、それともコミットが呼び出された後ですか?一意のキー(手動で生成されたもの)に問題があるため、重複します。これは、複数のユーザーが同じテーブルに同時にデータを挿入しているためだと思います。

更新1:

アプリケーションでキーを生成します。キーの例: '123456789123'、 '123456789124'、 '123456789125' .. ..

「VP123456」、「VP15S3456」のような古いキーがたくさんあるため(削除または変更できません)、キーフィールドはvarcharタイプです。もう1つの問題は、これらのキーを1つのデータベースに挿入した後、これらのキーを別のデータベースに挿入する必要があることです。そして、DBシーケンスとアトミックオブジェクトが何であるかわかりません。

更新2:

これらのキーは、データベースキーとしてではなく、財務ドキュメントで使用されます。したがって、これらは一意である必要がありますが、プログラミングのどこでもオブジェクトキーとして使用されることはありません。

4

2 に答える 2

1

これらのキーをどのように生成しますか? DB またはアトミック オブジェクトでシーケンスを使用してみましたか?

DBに同時にデータを入力するのは正常なので、私は尋ねています。

EDIT1:

アトミック カウンターに基づいて新しいキーを返すメソッドを作成できます。これにより、新しいキーを要求するたびに一意のキーを受け取ることがわかります。この戦略により、一部のキーが破棄される可能性があり、破棄される可能性がありますが、データベース内のキーが連続している必要がない限り、支払う代償はわずかです。

private AtomicLong counter; //initialized somewhere else.

public String getKey(){
  return "VP" + counter.incrementAndGet();
}

OracleMySqlなどの DB シーケンスに関するヘルプは次のとおりです。

于 2012-09-13T06:21:36.307 に答える
1

キーの生成を処理するシングルトンを作成することをお勧めします。シングルトンがデータベースからの最新の値で初期化された後にのみ、新しい ID を取得できることを確認してください。

2 つのデータベースへの不完全な挿入から保護するために、XA トランザクションを使用することをお勧めします。これにより、オール オア ナッシングの挿入と更新が可能になります。そのため、いずれかのデータベースで操作が失敗すると、すべてがロールバックされます。もちろん、XA トランザクションには欠点があります。非常に遅く、すべてのデータベースとデータベース ドライバーがサポートしているわけではありません。

于 2012-09-13T07:55:33.533 に答える