2014-02-24 1 views
2

많은 사용자가 특정 시점에 사용하는 웹 응용 프로그램이 있습니다. DB 관점에서 볼 때, 그들은 시스템을 통해 이동할 때 테이블의 수에 상관없이 지속적으로 데이터를 쓰고 읽습니다. 또한이 시스템에 데이터를 가져 오는 많은 프로세스가 있습니다.TransactionScope가 실수로 데이터베이스의 일부를 잠급니다.

오늘 가져 오기 프로세스를 디버깅하는 동안 트랜잭션 도중에 코드가 예외로 중지되었습니다. 거의 즉시 나는 시스템의 사용자가 실패한 쿼리에 대한 보고서를 받기 시작했습니다. 아무 래도 나는 내 행동을 그것과 연결시키고, 계속을 누르면, 갑자기 질문이 다시 일하기 시작했다. 간단히 말해서, 나는 나의 거래를 설정하는 방법이 이것에 대한 책임이 있다고 생각하지만, 그 영향을 충분히 회피 할 수있는 영향을 이해하지 못한다.

나는 트랜잭션이 필요하므로 잘못된 것이 있으면 롤백 할 수 있지만 범위가 활성 또는 "정지"인 동안 데이터베이스를 잠그는 것처럼 보입니다. 내가보고있는 문제를 방지하기 위해 이것을 바꿀 수있는 방법이 있습니까? 주어진 범위 내에서 스레드 실행 여부를 중요하지 않습니다 여부

는 범위가 활성화되어있는 동안이나 데이터베이스를 잠금 것으로 보인다
using (TransactionScope scope = new TransactionScope(
      TransactionScopeOption.Required, 
      System.TimeSpan.MaxValue)) 
      { 
       using (var context = new EntityContext()) 
       { 
        //lots of write operations in here 
       } 
      } 

답변

3

"를 걸어". 활성 트랜잭션이 잠금을 보유 할 수 있다는 점에서 올바른 것입니다.

보유 할 잠금은 작업량과 RDBMS에 따라 다릅니다. 마법의 "잠금 금지"옵션은 없습니다. 잠금 장치는 이유가 있습니다.

질문에 실행중인 쿼리에 대한 정보가 없다는 사실을 감안할 때, 스키마와 RDBMS는 RDBMS에서 잠금에 익숙해 지도록 권장 할 수 있습니다. 쉬운 해결책이 없습니다.

SQL Server를 사용하는 경우 트랜잭션 읽기를 위해 SNAPSHOT 격리를 조사해야합니다. 이는 블로킹 문제를 신속하고 포괄적으로 해결할 수 있습니다.

관련 문제