私の質問は、トランザクションと例外に関連しています
要件:
データベース テーブルに挿入するレコードが 10 個あります。すべてのレコードを挿入した後、別のテーブルにデータを挿入します。したがって、2 番目のテーブルへの挿入が失敗した場合は、そのレコードをロールバックしたいと考えています。
元。一度に 10 人分の現金振込 (1 つの口座から口座へ) を処理するとします。
擬似コード: ------------- EJB メソッドの開始
for(int i = 0; i < TransferRecords.length; i++)
{
try
{
//Deduct cash from TransferRecord.accountFrom --- Includes use of Hibernate Session
//Add cash in TransferRecord.accountTo -- Includes use of Hibernate Session
} catch(AppException exception)
{
//Rollback the transaction only for this particular transfer (i)
// But here when I go for next record it says session is closed
}
}
---------EJB メソッドの終了
ここでは @ApplicaitonException(rollback=true) アノテーションで AppException を作成しています。
必要な機能は次のとおりです。TransferRecord (たとえば 2) でトランザクションが失敗した場合でも、データをレコード 0、レコード 1、レコード 3、レコード 4 (など... レコード 2 ではなく) にコミットする必要があります。
ただし、ここでの問題は、TransferRecord 2 が失敗し、TransferRecord 3 に移動すると、「Session Closed」エラーが発生することです。
私の疑問は次のとおりです。1.これは正しいアプローチですか?または、EJB 2 の外部で (TransferRecord ごとに) for ループを実行する必要があります。セッションが閉じられていないが、トランザクションがロールバックされていることを確認するにはどうすればよいですか?
前もって感謝します。
EJB3、Hibernate 3.x、Jboss 4.2.x を使用しており、Container Managed Transaction を使用しています。