JDBCを使用して、 PostgresSQL 9.0データベース層を組み込んだ Java プロジェクトに取り組んでいます。SQL は関数にラップされ、JDBC を使用するストアド プロシージャのようにJavaで実行されます。
データベースにはヘッダー詳細スキームが必要であり、詳細レコードにはヘッダーへの外部キー ID が必要です。したがって、ヘッダー行が最初に書き込まれ、次に数千の詳細レコードが書き込まれます。 詳細の書き込みが完了するまで、ユーザーがヘッダーにアクセスできないようにする必要があります。
詳細レコードの書き込みが完了するまでヘッダー レコードをコミットできないように、トランザクション全体をラップすることをお勧めします。ただし、トランザクションを Java の呼び出しに分離したことを以下に示します。ヘッダーを書き込み、詳細をループします (詳細行を書き込みます)。データのサイズが非常に大きいため、詳細なデータを関数に渡して 1 つのトランザクションを実行することは現実的ではありません。
私の質問は、詳細レコードの書き込みが完了するまでヘッダーがコミットされないように、トランザクションを JDBC レベルでラップするにはどうすればよいですか?
最適なソリューションのメタファは、SQL Server の名前付きトランザクションです。このトランザクションは、データ アクセス レイヤー コード (他のトランザクションの外部) で開始され、後の DB 呼び出しで完了することができます。
次の (単純化された) コードはエラーなしで実行されますが、分離の問題は解決されません。
DatabaseManager mgr = DatabaseManager.getInstance();
Connection conn = mgr.getConnection();
CallableStatement proc = null;
conn.setAutoCommit(false);
proc = conn.prepareCall("BEGIN TRANSACTION");
proc.execute();
//Write header details
writeHeader(....);
for(Fault fault : faultList) {
writeFault(fault, buno, rsmTime, dnld, faultType, verbose);
}
proc = conn.prepareCall("COMMIT TRANSACTION");
proc.execute();
あなたの素晴らしい答えは大歓迎です!