Просто прочитайте эту интересную статью Омара в своем блоге Linq to SQL решает проблему взаимоблокировки транзакций и времени ожидания запроса с использованием незафиксированных операций чтения и в конце
Джавед Хасан начал спорить с ним о его решении ситуации с нолоком на большом сайте.
Здесь проблема, которую мы пытаемся решить, заключается в том, что с точки зрения SQL мы должны использовать операторы Select с NOLOCK или использовать SET TRANSACTION LEVEL READ UNCOMMITTED, в противном случае строки большого объема в БД будут заблокированы и вызовут ошибки. Используемая Омаром технология - это Linq2Sql, поэтому вопрос в том, как этого добиться в вашем коде доступа к данным на C #, чтобы вышеописанное не происходило?
В основном в этой статье Омар приходит к своему решению, работая и тестируя на реальных сайтах и с такими инструментами, как SqlProfiler, тогда как Джавед Хасан приходит к своему решению с документами MSDN, постом Скотта Хансельмана и т. Д.
Омар предлагает использовать следующее
using (var db = new DropthingsDataContext2())
{
db.Connection.Open();
db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
var user = db.aspnet_Users.First();
var pages = user.Pages.ToList();
}
тогда как Джавед Хасан предлагает
using (new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
//Your db Operation
}
Мне очень интересно узнать, что вы, ребята, делаете по этому конкретному вопросу на крупномасштабном сайте, таком как StatckOverflow, или что Джефф и их ребята делают в этом отношении?
Редактировать : После прочтения первого поста я хочу отметить несколько вещей в посте Омара.
- он столкнулся с проблемой соединения со своим подходом, но он решил ее, см. Его пост.
- , что более важно, он упомянул, что попробовал использовать транзакцию ADO.NET и даже попробовал то, что Скотт Хансельман написал в своем блоге, но это не работает для сайта с большими объемами, это несколько снижает производительность. Омар сказал, что «System.Transaction имеет значительные накладные расходы. Я никогда не мог использовать его на больших сайтах без того, чтобы процессор работал на 100%, а Req / sec снижался до 1/10. Это сделано для корпоративных приложений, а не для высоких». объем сайтов. "