よくあるシナリオがあります。標準のADOトランザクションを使用するのは簡単ですが、NH(私が知っている)ではそれほど多くはありません。
更新するテーブルが2つあります。最初の情報にはプロファイル情報(プロファイル)が含まれ、もう1つの情報(作業)には、実行する必要のあるレコードの変更とそれらの変更のステータスが含まれます。プロファイルテーブルが更新されるたびに、ワークテーブルのステータスが更新されます。
- プロファイルテーブルの更新に失敗した場合は、ワークテーブルのステータスを更新する必要があります。
- プロファイルテーブルへの更新が成功し、ワークテーブルへの更新が失敗した場合、トランザクションをロールバックする必要があります。
問題は、トランザクションをコミットするまで、プロファイルテーブルの更新が失敗したかどうかわからないことです。プロファイルでフラッシュを実行して例外をキャッチし、ステータスをWorkテーブルに書き込もうとしましたが、プロファイルの更新によって発生した例外でコミットが失敗します。
どうすればこれを処理できますか?通常のADOトランザクションでは、最初の呼び出しがスローされますが、トランザクション内の他のテーブルをキャッチして更新することはできます。
これが私のコードのようなものです-かなり標準的です。これは私の実際のコードではないので、問題に焦点を当ててください。トランザクションを破棄したり、セッションを閉じたりしていないわけではありません;):
try
{
ITransaction trans = _session.BeginTransaction();
var work = _repo.GetWork();
var profile = _repo.GetProfile(work.ProfileId);
try
{
profile.UpdateWithNewValues(work);
_session.SaveOrUpdate(profile);
_session.Flush();
work.Status = "Success";
}catch{
work.Status = "Failure";
}
_session.SaveOrUpdate(work);
trans.Commit();
}catch{
trans.Rollback();
}
Flush()が機能しないことはわかっていますが、他にこれを行う方法がわかりません。