2012-12-18 5 views
0

특별한 설정이 추가되지 않은 경우 끝에 단일 submitchanges()의 경우 linq to sql datacontext가 어떻게 작동합니까? 내 데이터베이스가 mssql 서버에 있습니다Linq DataContext 및 격리 수준

트랜잭션이 정확히 언제 시작되는지 혼란 스럽습니다. 다음 의사 과장 코드를 고려

DataContext dc= new DataContext(); 
Thread.Sleep(10 min); 
var rs = from a in dc.myTable Where.. select r; 
............. 
............. 
............. 
use rs //but do nothing to edit myTable.May be loop over it(?) to force execution 
............. 
............. 
Thread.Sleep(10 min); 
//read again, same criteria as before 
rs = from a in dc.myTable Where.. select r; 
............. 
............. 

dc.SubmitChanges() 
  1. 내가 명시 적으로 어디서나 코드와 DB를 모두 설정을 변경하지 마십시오. 내 선택 기준과 일치하는 테이블에 다른 행을 삽입 (및 커밋)하더라도 두 번째로 동일한 결과가 반환됩니까?
  2. 언제/언제 linq의 암시 적 트랜잭션이 정확히 시작됩니까? DataContext가 인스턴스화 될 때 오른쪽? 또는 dc.SubmitChanges()가 호출 될 때 DataContext를 사용하여 수행 할 작업 (또는 수행하지 않는 작업)에 따라? 명시 적으로 특정 격리 수준에서 트랜잭션을 시작하지 않는 경우

답변

0
  1. 는, 당신은 트랜잭션 외부에서 일어날 나는 최선을 다하고 읽기 믿습니다 기본 격리 수준에서 실행 읽습니다. 두 쿼리의 실행 사이에 다른 사용자가 조건에 맞는 다른 레코드를 삽입하면 두 번째 쿼리의 결과에 표시됩니다.
  2. 암시 적 트랜잭션은 실제 데이터가 데이터베이스에 제출되고 직후에 시작됩니다. SubmitChanges 번으로 여러 번 전화하면 모든 통화에 대한 거래가있게됩니다.
  3. 첫 번째 질문에 관해서

: 당신이 트랜잭션 내부 쿼리를 실행 할 경우, 당신이 사용하는 격리 수준주의, 그리고 테이블 '잠금 에스컬레이션 정책이 어떻게 설정되어 있습니다. 기본적으로 using (var scope = new TransactionScope())을 사용하면 첫 번째 쿼리로 인해 테이블이 잠기 게됩니다. 레코드를 삽입하려는 다른 사용자는 시간이 초과되어 잠시 기다리고 작업이 거부되는 결과를 초래합니다. 격리 수준에 대한 자세한 내용은 here을 참조하십시오.