这是我3个项目中存在的一个问题。

我尝试了以下内容:

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

设置在Hibernate.cfg.xml中

使用流利的nhibrate:

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted);

设置在global.asax.cs中

我一直被迫这样做:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted);

有效。 (我可以使用NHIBERNATE PROFILER看到这一点)

问题是现在我正在使用尖锐的体系结构和交易。在该框架内被称为内部,我在重建它时遇到了麻烦。

有没有办法做到这一点,可以在开始交易时明确设置它?

有帮助吗?

解决方案

您确定是这种情况吗?如果您仅通过NHPROF告诉您的内容来验证隔离级别;那可能是一个问题。请记住,NHPROF仅报告NHIBERNATE中的日志记录基础架构的供电。也许当您与默认交易打开交易时,隔离级消息不会发送?可以通过研究NHIBERNATE来源来验证这。

我建议在得出结论认为这无法正常工作之前使用替代方法来验证交易级别(也许是SQL Profiler?)。

编辑:

我已经看了NHIBERNATE的来源,可以验证上面的Hunch。如果您看着 经逆转 来源您会注意到,它正在记录隔离级别的隔离级别。未指定事务启动而无需指定特定隔离级别。

// 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的TRUNK版本中修复了,因此我猜这不再是NHIBERNATE 3.xx的问题。

其他提示

看起来您的属性设置应称为Hibernate.connection.isolation ...

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

问候

乔恩

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top