Я уже некоторое время ищу здесь и в других местах и не могу найти хорошего ответа на вопрос, почему нельзя использовать Linq-TO-SQL с NOLOCK ..
Каждый раз, когда я ищукак применить подсказку with (NOLOCK) к контексту Linq-To-SQL (примененному к оператору 1 sql), люди часто отвечают за принудительное выполнение транзакции (TransactionScope) с IsolationLevel, для которого установлено значение ReadUncommitted.Что ж, они редко говорят, что это приводит к тому, что соединение открывает транзакцию (которую я тоже где-то читал, нужно обязательно закрыть вручную).
Использование ReadUncommitted в моем приложении как есть, на самом деле не так уж хорошо. Сейчас я использую контекстные операторы для одного и того же соединения друг с другом.Например:
using( var ctx1 = new Context()) {
... some code here ...
using( var ctx2 = new Context()) {
... some code here ...
using( var ctx3 = new Context()) {
... some code here ...
}
... some code here ...
}
... some code here ...
}
При общем времени выполнения, равном 1 секунде, и одновременном изменении количества пользователей, изменение уровня изоляции заставит контексты ждать, пока друг друга не освободят соединение, поскольку все соединения виспользуется пул соединений.
Таким образом, одной из многих причин для перехода на nolock является предотвращение взаимных блокировок (сейчас у нас 1 тупик клиента в день).Следствием вышесказанного является просто еще один вид тупика, который на самом деле не решает мою проблему.
Итак, я знаю, что могу сделать следующее:
- Избегать вложенного использования одного и того же соединения
- Увеличение размера пула соединений на сервере
Но моя проблема заключается в следующем:
- Это невозможно в ближайшем будущем из-за большого количества строк кода.и это будет конфликтовать с архитектурой (даже не начав комментировать, хорошо это или плохо)
- Даже если это, конечно, сработает, это то, что я бы назвал «симптоматическим лечением» - как я это понимаюне знаю, насколько сильно вырастет приложение, и будет ли это надежным решением на будущее (и тогда я могу столкнуться с еще худшей ситуацией с гораздо большим количеством пользователей)
Мои мыслиявляются:
- Действительно ли верно, что NoLock невозможен (для каждого оператора без запуска транзакций)?
- Если 1 - правда, может ли это быть на самом деле нет?кто-то другой получил эту проблему и решил ее в общей модификации linq to sql?
- Если 2 верно - почему это не проблема для других?
- Есть ли другой обходной путь, на который я, возможно, не обращал внимания?
- Много раз использование одного и того же соединения (вложенного) является настолько плохой практикой, что ни у кого нет этой проблемы?