2013-04-25 4 views
1

trasaction에 대한 격리 수준 선택은 트랜잭션의 성격에 달려 있다고 생각합니다. 그러나 필자가 보았 듯이 항상 READ_UNCOMMITTED를 사용하는 것을 피하는 것이 좋습니다. 대부분의 데이터베이스는 READ_COMMITTED를 기본 격리 수준으로 사용합니다. 여하튼 나는 읽지 않은 것에 대한 READ COMMITTED의 이점을 관찰하기가 느리다.데이터베이스 격리 수준에서 READ COMMITTED보다 READ COMMITTED의 장점은 무엇입니까? 아니면 더티 읽기가 그렇게 나쁜 것으로 간주되는 이유

READ COMMITTED의 유일한 장점은 읽지 않은 채로 나는 READ COMMITTED를 보았습니다. 나는 DIRTY READ가 Transaction ROLLBACK (더티 읽기가 이루어지는 트랜잭션)의 경우에만 데이터베이스의 비 일관성을 만들 수 있음을 발견했다. 이것은 트랜잭션 ROLLBACK이 일어날 가능성이 거의없는 (또는 결코 말하지 않는) 시스템의 일부를 의미합니다. READ COMMUNICATION이 READ COMMITTED보다 우수한 성능을 제공합니다.

대소 문자를 구하십시오. 우리는 레코드 A = 100; B = 200;

T1(READ_UNCOMMITTED) | T2 
         | A = A + 100 //(A=200 NOW) 
READ(A); //200  | 
B = B + A //400  | 
COMMIT;    | 
         | COMMIT; 

데이터베이스가 일관성없는 유일한 방법은 트랜잭션 T2 '롤백'입니다. 이제는 T2가 ROLLBACK을 가질 가능성이 거의 없다면 퍼포먼스가 약간의 위험을 감수하면서 얻는 것처럼 느껴질 것입니다. 사전

편집 이 하나

덕분에 우리가 두 개의 트랜잭션 T1 (세션 1), T2 (세션 2)가 있다고 가정 해 봅시다 @Quassnoi 있도록 코멘트 너무 깁니다. T2는 일관성 상태 DB_S1에서 DB_S2로 데이터베이스를 가져옵니다. 이미 READ_UNCOMMITTED로 T1이 DB_S1 또는 DB_S2와 호환되지 않는 결과를 줄 수 있음을 알고 있습니다. READ_COMMITTED를 사용하는 T1에 대해서도 마찬가지입니다.

Lets say a schedule: T1 starts, counts 100; 
T2 starts -> has updated row 1 to .9M ; 
T1 starts -> counts 150 
T2 starts -> finish update 
T1 starts -> can't find anything where value = 1 hence finish. 

T1은 결코 존재하지 않는 150이라는 결과를 제공합니다.

이 경우 T1은 일관성 결과를 보장하기 위해 Searializable Lock이 필요합니다. 그렇지 않으면 트랜잭션 스케줄러가 필요합니다.

세션 1 :

+0

't1'에'SERIALIZABLE'이 필요 없으므로'READ COMMITTED'이면 충분합니다. 't2'에 의해 잠긴 첫 번째 행/페이지를 만나는 순간 멈추고't2' 완료를 기다립니다. – Quassnoi

+0

@Quassnoi 확실한가요? 저는 두 세션 (다른 연결)을 사용하여 mysql을 시도했지만 T2는 쓰기 잠금을 얻었지만 T1은 여전히 ​​이전 값을 읽습니다. 또한 T1에 의해 언급 된 경우 T1은 100으로 계산되고 T2에 의해 커밋 된 데이터가 표시되므로 결과로 100이 여전히 잘못됩니다. IMHO T1에는 범위 잠금이 필요합니다. –

+0

't1'과't2'는 테이블의 모든 레코드를 처리하지 않으면 리턴하지 않습니다. 't1'은'0' 또는'1M'을 반환합니다 (또는 결과 또는 교착 상태 해결로 롤백 될 것입니다).'t1'은 이미 처리 된 레코드에 공유 잠금을 설정하므로't2'는 해당 레코드를 업데이트 할 수 없으므로't1'이 완료 될 때까지 기다려야합니다. – Quassnoi

답변

0

, 당신은 1M 레코드가있는 테이블이 다음 value = 1

당신이 동시에 두 쿼리를 실행 가진 모든 기록을 상상해

SELECT COUNT(*) 
FROM mytable WITH (NOLOCK) 
WHERE value = 1 

세션 2 :

UPDATE mytable 
SET  value = 2 
WHERE value = 1 

SQL Server에서 첫 번째 큐 ry는 01,000,000 사이의 임의의 숫자를 반환합니다.

+0

READ_COMMITTED보다 READ_COMMITTED의 이점을 알고 싶습니다. 예를 들어 READ_COMMITTED는 DIRTY_READ 만 방지하지만 세션 1이 세션 2에서 업데이트 한 모든 행에 대해 READ_UNREPEATABLE 현상을 일으킬 수 있습니다. 시나리오는 READ_UNCOMMITTED 또는 READ_COMMITTED에 적합하지 않습니다. –

+0

@SaurabhTripathi :'READ COMMITTED'를 사용하면 첫 번째 쿼리에 대해 항상'0' 행 또는'1M'을 얻을 수 있습니다. 'READ UNCOMMITTED'로, 당신은 그 둘 사이에 임의의 숫자를 얻을 수 있습니다. 이것은 아마도 첫 번째 쿼리에서 원하는 것이 아닙니다. – Quassnoi

+0

READ COMMITTED (READ COMMITTED)를 사용해도 존재하지 않는 임의의 숫자를 얻을 수 있다고 생각합니다. 내 설명을 위해 새 편집 내용을 참조하십시오. –

관련 문제