2009-12-17 5 views
3

transactionscope을 사용하여 데이터가 데이터베이스에 올바르게 읽히도록합니다. 그러나 트랜잭션이 실행되는 동안 다른 페이지에서 일부 데이터를 선택할 필요가있을 수 있습니다. 이것을 할 수 있을까요? 나는 데이터베이스에 관해서는 매우 멍청하다.트랜잭션이 발생하는 동안 데이터를 선택할 수 있습니까?

LinqToSQL 및 SQL Server 2005 (dev)/2008 (prod)을 사용하고 있습니다.

+1

언제나 최선의 답변 : 시도해 보셨습니까? – delfuego

+1

@delfuego : 잠재적으로 잘못 될 수있는 것들이 너무 많기 때문에 나는 동의하지 않는다. 이것은 시도하는 것보다는 읽거나 묻는 것으로 대답해야하는 종류의 질문입니다. 그러나 OP에서 데이터베이스에 대한 책 한 권 또는 몇 권을 읽도록 권합니다. – erikkallen

답변

1

예, 트랜잭션 실행 중에도 데이터베이스에서 데이터를 선택할 수 있습니다.

트랜잭션 (예 : 테이블의 행이 업데이트되지 않음)의 영향을받지 않는 데이터는 일반적으로 다른 트랜잭션에서 읽을 수 있습니다. (특정 상황에서 SQL Server는 테이블의 모든 행에 대한 읽기를 중지하는 테이블 잠금을 도입하지만 일반적으로 쿼리 나 서버에서 발생하는 비정상적인 현상입니다.

Transaction Isolation Levels을 살펴 봐야합니다. 이러한 동작이 어떻게 작동하는지 정확하게 제어 할 수 있기 때문입니다.

다음은 트랜잭션 범위의 격리 수준을 설정하는 C# 코드입니다. 트랜잭션 (또는 NOLOCK 같은 모든 테이블 힌트) 당신이 당신의 거래에 묶여 활동에서 응용 프로그램의 나머지 부분을 보호하는 데이터 잠금의 다른 수준을 얻을에 지정된 트랜잭션 격리 수준에 따라 일반적으로

TransactionOptions option = new TransactionOptions();   
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;   
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Required, options) 
{ 
    // Code within transaction 
} 

. 예를 들어 트랜잭션 격리 수준이 READUNCOMMITTED 인 경우 해당 트랜잭션 내에서 발생하는 쓰기를 볼 수 있습니다. 이것은 더티 읽기를 허용하지만 데이터에 대한 (대부분의) 잠금을 방지합니다.

스케일의 반대쪽 끝은 SERIALIZABLE과 같은 분리 레벨로서 거래 활동이 완전히 완료 될 때까지 완전히 격리됩니다.

0

예, 기본적으로 TransactionScope은 트랜잭션과 관련된 테이블을 잠글 것입니다. 당신이 트랜잭션이 진행되는 동안 읽을 필요가있는 경우, TransactionOptionsIsolationLevel.ReadUncommitted와 다른 TransactionScope를 입력 :

TransactionScopeOptions = new TransactionScopeOptions(); 
options.IsolationLevel = IsolationLevel.ReadUncommitted; 
using(var scope = new TransactionScope(
    TransactionScopeOption.RequiresNew, 
    options 
) { 
    // read the database 
} 

을 LINQ - 투 - SQL DataContext으로 : System.Transactions.IsolationLevel를 사이에 차이가 있음을

// db is DataContext 
db.Transaction = 
    db.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 

주 및 System.Data.IsolationLevel. 예, 올바르게 읽었습니다.

+0

TransactionScope가 전체 데이터베이스를 잠그지 않습니다 .... – RickNZ

+0

맞습니다. 나는 더 정확 했어야했다. – jason

+0

좋아, 첫번째 downvote는 부정확하기 때문에 공정 하 그러나 downvoter는 친절하게 논평하기 위하여이었다. @ 두 번째 downvoter : 무슨 일이야? – jason

0

이미 제공된 조언에 추가하여 스냅 샷 격리 모델을 살펴 보는 것이 좋습니다. Using Snapshot Isolation에 좋은 토론이 있습니다. 데이터베이스에서 커밋 된 읽기 스냅 샷을 활성화하면 독자가 더 이상 작성자에 의해 차단되지 않으므로 많은 경쟁 문제가 완화 될 수 있습니다. 기본 읽기는 읽기 위탁 격리 모드에서 수행되므로이 ​​간단한 데이터베이스 옵션 스위치는 즉각적인 이점을 가지며 응용 프로그램을 변경할 필요가 없습니다.

무료 런치가 없으므로이 가격에는 tempdb에 대한 추가로드 인 가격이 제공됩니다 (Row Versioning Resource Usage 참조).

Explicit 격리 수준을 사용하는 경우와 특별히 기본 TransactionScope Serializable 모드를 사용하는 경우에는 코드를 검토하여 ReadCommited 격리 수준을 강화해야합니다. 어떤 분리 레벨을 사용하는지 모를 경우 ReadCommited를 사용한다는 의미입니다.

+0

드라이브 바이 downvote? 권자 –

관련 문제