Последующий отчет this other question.NHibernate - пессимистическая блокировка не работает
Я пытаюсь реализовать пессимистическую блокировку для проблемы параллелизма, как я описал в вопросе выше (пожалуйста, не стесняйтесь добавлять к нему). Но это не работает для меня.
Я делаю очень простой тест: у меня есть два отдельных сайта, которые увеличивают счетчик 500 раз. Я запускаю их одновременно. В конце концов, я ожидаю, что определенная колонка в моей таблице, вы предполагаете, имеет значение 1000.
Вот код. Конечно, это не производственный код, но тестовый код или нет, он все равно должен работать, правильно?
for (int i = 0; i < 500; i++)
{
var tx = this.userRepo.Session.BeginTransaction();
var user = this.userRepo.GetById(42);
user.Counter++;
userRepo.Save(user);
tx.Commit();
}
Метод GetById
использует LockMode.Upgrade:
public T GetById(int id)
{
T obj = Session.Get<T>(id, LockMode.Upgrade);
return obj;
}
Теперь, используя NHProfiler я вижу следующий SQL заявление:
SELECT Id FROM 'User' WHERE Id = 42 for update
, но результатом является значение около , так что примерно половина обновлений потеряна из-за параллелизма. Что я делаю не так? Я отключил кеш второго уровня в этом тесте. Использую ли я неправильный режим блокировки? Должен ли я указывать уровень изоляции? Что-нибудь еще? Заранее спасибо.
EDIT: FluentNhibernate конфигурации:
Fluently.Configure()
.Database(MySQLConfiguration.Standard.ConnectionString(connectionstring))
.Mappings(m => assemblyTypes.Select(t => t.Assembly).ToList().ForEach(a => m.FluentMappings.AddFromAssembly(a)))
.ExposeConfiguration(c => c.Properties.Add("hbm2ddl.keywords", "none"));
Можете ли вы опубликовать свой конфигурационный код Nhibernate? – UpTheCreek 2010-11-23 08:41:23
@UpTheCreek: используя FluentNH, не уверен, что вы хотите видеть, но я включил его. – Razzie 2010-11-23 09:12:32