私はNHibernate 3を使用しています。私のアプリケーションはSQL Server 2008に対して実行すると正常に動作しますが、SQL 2000で断続的なエラーが発生しています(私たちはNH言語を適切に変更しました)。エラーはすべてMDTC(分散トランザクション)コンポーネントに関連しています。通常、読み取りは正常ですが、コードは保存/更新中に爆発しますが、必ずしも同じエラーではありません。私たちがよく見てきたのは、「分散トランザクションが完了しました。このセッションを新しいトランザクションまたはNULLトランザクションに参加させてください。 'NHibernate IPreUpdateEventListener/IPreInsertEventListenerにアクティブなトランザクションがないのはなぜですか?
私はこれの根本原因を調査しており、いくつかのログを追加しました。 IPreUpdateEventListenerとIPreInsertEventListenerインターセプタが定義されているので、そこに私のリポジトリと同様にログインします。私が見つけているのは、私がリスナーに着くまでに、現在のセッションには取引がないということです。ここで
は私のリポジトリのコードです:
public virtual void Save(object entity)
{
logger.DebugFormat("Opening transaction to save entity type {0}.", entity.GetType().Name);
using (var t = new TransactionScope())
{
GetSession().SaveOrUpdate(entity);
logger.DebugFormat("Committing transaction.");
t.Complete();
}
}
そしてここでは、私のイベントリスナーのコードです:
logger.DebugFormat("Save/Insert entity. Transaction.Active = {0}",
persister.Factory.GetCurrentSession().Transaction != null
? persister.Factory.GetCurrentSession().Transaction.IsActive.ToString()
: "no transaction");
そしてここでは、ログ出力されます:
2011-01-14 17:23:13,549 [9] DEBUG BaseRepository`1.Save - Opening transaction to save entity type XXXXXXX.
2011-01-14 17:23:13,566 [9] DEBUG BaseRepository`1.Save - Committing transaction.
2011-01-14 17:23:13,598 [9] DEBUG AuditEventListener.Audit - Save/Insert entity. Transaction.Active = False
あなたは何を見ることができますこれは間違っていますか?プレ・インサートにトランザクションがアクティブでない理由は何ですか?誰かが私はSQL Server 2000のために何か特別なことを知っていますか(MSDTCはスイッチオンされていますか?) 2008環境では、Windows 7を実行して、私のローカルマシンであり、SQL Server 2000サーバーは、サーバー2003
ありがとう。それは私が疲れているのを見ていないことでした。 NHトランザクションを使用するように切り替えましたが、類似しているが関連するエラーがあり、session.BeginTransaction()を実行したにもかかわらず、イベントリスナーでTransaction.Activeがまだfalseでした。これは、アプリケーションがSql Serverとは異なるマシン上にある場合にのみ発生するため、ネットワーク/アクセス許可に関連していると想定しています。 –