2

2 つのステップでスプリング バッチ ジョブを実行する必要があるとします。ステップ 1 は、postgres テーブルからデータを読み取り、同じテーブルの値を更新することです。ステップ 2 は、別の postgres テーブルからデータを読み取り、このテーブルを更新することです。このシナリオのジョブ レベルでトランザクションを達成するにはどうすればよいですか?

つまり、2 番目のステップが失敗した場合は、最初のステップをロールバックする必要があります。

4

3 に答える 3

1

信頼できる(またはデータベース側で多くのリソースを必要としない)自動連鎖/マルチレベルトランザクション処理を備えたソリューションが存在するかどうかはわかりません

2 番目のステップが失敗した場合は、最初のステップをロールバックする必要があります

両方のステップを 1 つにまとめることができます。

  • 最初のテーブル A から読み取る
  • プロセッサを使用してテーブル A を更新する
  • プロセッサを使用してテーブル B から読み取る
  • ライターを使用してテーブル B を更新する

テーブル B の読み取りは、テーブル a のカーソルベースの読み取りに対して単一の読み取りになるため、パフォーマンスは大幅に低下します。

私はこのような補償戦略をとります

  • (オプション) 使用中のテーブルは一時テーブルであり、実際の「本番」テーブルではありません。本番環境からデータストアを分離することで、補正を行いやすくなります。
  • ステップ 1 が失敗すると、別のステップまたは別のジョブ/スクリプトがトリガーされます
  • このステップ/ジョブ/スクリプトは必要に応じて削除します (行または完全なテーブル)
于 2012-01-11T11:43:02.683 に答える
1

ジョブレベルのトランザクションの使用を検討しましたか?

Spring Batch のジョブレベルのトランザクション性

制限外のコミットまたはロールバックを回避するために、管理している潜在的なボリューム サイズを考慮することが重要です

于 2012-10-24T06:33:42.253 に答える
-1

ステップ 1の前にBEGINステートメントを置き、ステップ 2の後に COMMIT ステートメントを置きます

于 2012-01-11T11:04:32.117 に答える