1

에 대한 요청 당 하나의 ObjectContext를 만들기 위해 기본값으로 :NOLOCK이 코드에 대한 부작용이 있습니까 EF4


///This code runs per request 
public static MyObjectContext CreateEntity() 
{ 
    MyObjectContext db=new MyObjectContext(); 

    db.Connection.Open(); 
    var con = (SqlConnection)((EntityConnection)hi.Connection).StoreConnection; 
    SqlCommand cmd = new SqlCommand("set transaction isolation level read uncommitted",con); 
    cmd.ExecuteNonQuery(); 

    return db; 
} 

이제 "DB"인스턴스가 ReadUncommited 실행 모드?

답변

0

부작용은 연결을 수동으로 처리해야하며 연결이 전체 수명 동안 컨텍스트에 의해 유지된다는 것입니다. 또한 효율성이 떨어질 수있는 전체 수명 동안 열어 두었습니다.

또 다른 부작용은 커밋되지 않은 격리 수준 자체를 읽습니다. 커밋되지 않은 격리 수준 자체는 커밋되지 않은 트랜잭션 데이터를 읽을 수 있으므로 사용하는 것은 매우 위험합니다.

왜 필요한가요? 기본적으로 EF는 데이터베이스 서버의 기본 트랜잭션 격리 모드를 사용합니다. SQL 서버의 경우 커밋 된 것으로 읽습니다. EF는 기본적으로 각 읽기 작업이 해당 읽기 작업 만 지속되는 트랜잭션의 일부이기 때문에 레코드에 대한 잠금을 보유하지 않습니다. SaveChanges 만 여러 데이터베이스 명령에 대해 트랜잭션을 사용합니다.

+0

테이블이 있습니다 (User_Notification). 테이블에 심한 인서트 하중이 있습니다. –

+0

그러면이 테이블에 액세스 할 때만 읽기를 사용하지 않는 것이 어떻습니까? –

+0

나는 꽤 많은 시간 동안 같은 문제로 고심하고있다. 우리 DB 팀은 격리 수준을 UNCOMMITTED로 설정해야한다고 주장합니다. 저는 저장소 명령을 사용하여 컨텍스트 레벨에서이를 수행합니다. 그러나 후속 쿼리가 실패하면 다음 오류가 발생합니다. 'READ COMMITTED 또는 REPEATABLE READ 격리 수준에서만 READPAST 잠금을 지정할 수 있습니다.' 일부 쿼리는 기본적으로 READPAST 잠금을 사용하고 있으며 프로필러에서 해당 쿼리를 볼 수 없습니다. 어떤 아이디어? – Praveen

관련 문제