2

このユースケースに何か特別なものがあるかどうかはわかりませんが、誰かが何らかの有用な構造/技術/デザインパターンを作成した可能性が高い場合のように感じました。

私の状況

  • 関連するステージングテーブルからの結合を介して、非常に大きなテーブルのセットのいずれかにデータを挿入/更新/削除するために、中間層(Java)から実行されるSQLコマンドのセットがあります。

  • ステージングテーブル/実際のテーブルの内容に基づいてさまざまな派生テーブルを更新するSQLコマンドが他にもあります。異なるテーブルは、(通常どおり)異なるクエリを介して異なる派生テーブルと対話します。ユースケースによっては、これらのコマンドを最初のセットとインターリーブする必要がある場合があります。そのため、必ずしもセット1を実行してからセット2を一度に実行できるとは限りません。

私の質問

したがって、順次実行されるコマンドのチェーンを構築する必要があり、いずれかが失敗した場合はロールバックをトリガーする必要があります。これを可能な限り明確で文書化された方法で行いたいと思います。

誰かがこれをコーディングする標準的な方法を知っていますか?ストアドプロシージャコードから中間層コードに移行する人は、これまでにこれを行ったことがあると思います。適切なオプションがある場合は、車輪の再発明をしたくありません。


追加情報

私の主な関心事の1つは、すべてを明確にすることです。詳細を説明するために、次の目的で特別に設計された一連のクエリを用意します。

  • ステージングテーブルA'を切り捨てて、削除レコードを対象とする主キーを入力します
  • A'との結合に基づいて実際のテーブルAから削除します
  • ステージングテーブルA'を切り捨てて、アップサートの完全なデータを入力します
  • 結合に基づいてA'からAにレコードを更新/挿入します

同じロジックがテーブルB、C、Dなどにも適用されます。残念ながら、AとCだけが、削除後、削除前に、特定の派生テーブルへの削除の同期などの追加の手順を必要とする場合があります。アップサート。

明らかに、テーブルを更新するためのすべてのロジックをグループ化し、派生テーブルを更新するためのすべてのロジックもグループ化したいのですが、実行時にインテリジェントにインターリーブする必要があり、これは面倒に聞こえます。

4

1 に答える 1

3

そんなことを自分で書いてはいけません。これがJTAの誕生です。

JPAまたはSpringのいずれかを使用して実行できます。

作業単位にトランザクションとして注釈を付け、データベースとJDBCに処理させます。

自分で行う必要がある場合は、アスペクト指向のアプローチに従い、装飾的な「前後」の実装にします。

于 2013-03-19T19:49:05.983 に答える