2012-03-01 5 views
1

Я пытаюсь исследовать проблему, связанную с .NET ActiveRecord на SQL Server 2008.ActiveRecordMediator.SaveAndFlush таблица блокировки SQL Server

У нас есть базовый класс репозитория, где у нас есть методы, определенные для сохранения и обновления объектов, эти методы обычно вызывайте непосредственно на ActiveRecordMediator.

У нас есть конкретный экземпляр, если мы вызываем ActiveRecordMediator.SaveAndFlush на одном из наших сущностей, а затем пытаемся выполнить сохраненный процесс, который читается из таблицы, которую мы только что сохранили, sproc будет зависать.

Глядя на SQL Server, таблица заблокирована, поэтому ее невозможно прочитать. So мои вопросы таковы:

  1. Почему мой SaveAndFlush блокирует стол?
  2. Как я могу гарантировать, что блокировка не возникает?

Это приложение работает как веб-сайт ASP.NET, поэтому я предполагаю, что он поддерживает сеансы на основе запроса, но я не могу быть уверен.

ответ

1

Я считаю, что я понял, почему это произошло.

NHibernate, когда используется в нашей среде, проведет транзакцию, открытую для всего запроса, а затем, наконец, когда сеанс будет удален, будет совершена транзакция.

Наш sproc не использовал ту же транзакцию, что и NHibernate, поэтому возникла блокировка.

Я частично исправил проблему, обернув мою экономию на стороне сервера объекта в использовании

using(var ts = new TransactionScope(TransactionMode.New)) 
{ 
    ActiveRecordMediator.SaveAndFlush(value); 
    ts.VoteCommit(); 
} 

Таким образом, объект будет сохранен и совершенным немедленно.

Смежные вопросы