自分のアーキテクチャで作業単位が間違って設定されている可能性があると思います。これが私が現在持っているものです(順序を示すためにインデントされています):
HttpRequest.Begin()
UnitOfWork.Begin()
Session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
ここでは、NHibernateを使用してクラッドを実行するためにさまざまなサービスを呼び出します。データベースに変更(更新/保存)を行う場合は、次のコードを呼び出します。
using (var transaction = unitOfWork.Session.BeginTransaction())
{
try
{
// These are just generics
ret = (Key)unitOfWork.Session.Save(entity);
transaction.Commit();
rb.unitOfWork.Session.Clear();
}
catch
{
transaction.Rollback();
rb.unitOfWork.Session.Clear();
rb.unitOfWork.DiscardSession();
throw;
}
}
HttpRequestが終了したら、次の手順を実行します。
UnitOfWork.Commit()
Transaction.Commit() // This is my sessions transaction from the begin above
大規模なバッチプロセスをロールバックできるという問題が発生しています。上記のように、CRUDレイヤーでトランザクションをコミットしているため、トランザクションはアクティブではなくなり、UnitOfWorkでロールバックしようとすると、トランザクションがすでにコミットされているため、何も実行されません。CRUDレイヤーでコードをコミットする理由は、データベースを長時間ロックすることなく、データをできるだけ早く永続化できるようにするためです。
上記のような状況で取るべき最善の行動方針は何ですか?バッチジョブをコミットせず、ジョブの最後にコミットを処理する特別なCRUD操作を行うだけですか、それともUnitOfWorkとSession Per Requestのロジックに欠陥がありますか?助言がありますか?