나는의의 CommandText를 수정하고있어 LINQ - 투 - SQL은 다음과 같이 NOLOCK을 사용하여 강제로 ... linq-to-sql commandtext를 수정할 때 연결을 닫아야합니까?
if (db.Connection.State == System.Data.ConnectionState.Closed)
db.Connection.Open();
var cmd = db.GetCommand(db.Customers.Where(p => p.ID == 1));
cmd.CommandText = cmd.CommandText.Replace("[Customers] AS [t0]", "[Customers] AS [t0] WITH (NOLOCK)");
var results = db.Translate(cmd.ExecuteReader());
그것은 데이터 컨텍스트가 기본 컨트롤러 그래서, MVC 응용 프로그램, 그리고 할 수 있습니다
이 코드보다 먼저 사용되었으며, 더 중요한 것은 이후입니다. 이 루틴에서 연결을 종료해야합니까? 아니면 전혀? 아니면 내가 여기 열었을 때만?업데이트 :
나는 지금의 CommandText를 수정 (DataContext를 클래스에서) 더 일반적인 기능을 사용하고, 여기에 개설 된 경우 연결을 종료하고 있습니다. 그리고 open은 ExecuteReader로 이동되었습니다. 지금까지 그것은 일하고 있으며 산발적 인 교착 상태 문제를 줄였습니다. 결과는 2 등분 할 필요가 없습니다.
public List<T> GetWithNolock<T>(IQueryable<T> query)
{
// to skip nolock, just...
// return query.ToList();
List<T> results = null;
bool opened = false;
try
{
if (Connection.State == System.Data.ConnectionState.Closed)
{
Connection.Open();
opened = true;
}
using (var cmd = GetCommand(query))
{
cmd.CommandText = Regex.Replace(cmd.CommandText, @"((from|inner join) \[dbo.*as \[t\d+\])", "$1 with (nolock)", RegexOptions.IgnoreCase);
results = Translate<T>(cmd.ExecuteReader()).ToList();
}
}
finally
{
if (opened && Connection.State == System.Data.ConnectionState.Open)
{
Connection.Close();
}
}
return results;
}
나는 과거에 트랜잭션을 권장 방법으로 사용하면 사이트의 연결이 밤 사이에 끊어지는 것을 발견했습니다. 내가 아는 한, 그것은 linq-to-SQL의 버그입니다. 그 주위에는 여러 가지 방법이있을 수 있지만 필자의 주요 코드는 간단하게 작성하려고합니다. 이제는 "그냥"해야합니다 ...
var users = GetWithNolock<User>(
Users
.Where(u => my query
);