NHibernate 3 を使用しています。アプリケーションは SQL Server 2008 に対して実行すると問題なく動作しますが、SQL 2000 では断続的にエラーが発生します (NH ダイアレクトを適切に変更しました)。エラーはすべて MDTC (分散トランザクション) コンポーネントに関連しています。通常、読み取りは正常に機能しますが、保存/更新中にコードが爆発しますが、常に同じエラーが発生するとは限りません。よく目にするのは、「分散トランザクションが完了しました。このセッションを新しいトランザクションまたは NULL トランザクションに登録してください。
この根本的な原因を調査しており、いくつかのログを追加しました。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 サーバーは Server 2003 であることに注意してください。