6

これは私にとって3つのプロジェクトに存在する問題でした。

私は以下を試しました:

<property name="connection.isolation">ReadCommitted</property>

hibernate.cfg.xmlで設定

流暢なnhiberateの使用:

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted);

global.asax.csで設定

私はいつもそれをそのように設定することを余儀なくされてきました:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted);

動作します。(これはNHibernate Profilerを使用して確認できます)

問題は、シャープなアーキテクチャとtransaction.beginがそのフレームワーク内で呼び出され、再構築に問題があることです。

トランザクションを開始するときに明示的に設定せずに機能するこれを行う方法はありますか?

4

2 に答える 2

7

これが事実であると確信していますか?NHProf が伝えていることによって分離レベルのみを確認している場合。それは問題になる可能性があります。NHProf は、NHibernate のロギング インフラストラクチャがフィードするものだけを報告していることに注意してください。デフォルトでトランザクションを開いたときに、分離レベル メッセージが送信されないのではないでしょうか? これはおそらく、NHibernate のソースを調査することで確認できます。

これが期待どおりに機能していないと結論付ける前に、代替手段を使用してトランザクションレベルを確認することをお勧めします (おそらく SQL プロファイラー?)。

編集:

NHibernate のソースを見て、上記の私の予感を確認できました。AdoTransactionソースを見ると、特定の分離レベルを指定せずにトランザクションが開始されると、IsolationLevel.Unspecified の分離レベルがログに記録されていることがわかります。

// This is the default overload you're calling:
public void Begin()
{
Begin(IsolationLevel.Unspecified);
}

// This is the full method impl
public void Begin(IsolationLevel isolationLevel)
{
// snip....

// This is the problematic line here; it will report an isolationLevel of Unspecified.
log.Debug(string.Format("Begin ({0})", isolationLevel));

// snip...

}

ただし、実際のトランザクションは、次のように数行下の構成で指定された分離レベルで開始されています。

if (isolationLevel == IsolationLevel.Unspecified)
{
isolationLevel = session.Factory.Settings.IsolationLevel;
}

したがって、この場合、NHProf は完全に正確ではないように思われます。

アップデート:

これは NHibernate のトランク バージョンで修正されているようです。したがって、これは NHibernate 3.xx ではもはや問題ではないと推測しています。

于 2010-09-29T20:52:50.230 に答える
0

プロパティ設定は hibernate.connection.isolation... と呼ばれる必要があるようです

<add key="hibernate.connection.isolation" value="ReadCommitted" />

よろしく

ジョン

于 2010-09-13T05:58:46.843 に答える