복붙노트

[SQL] 읽기 커밋과 반복 읽기의 차이

SQL

읽기 커밋과 반복 읽기의 차이

나는 위의 격리 수준이 너무 비슷하게 생각합니다. 누군가가 주요 차이점은 무엇 멋진 예제와 함께 설명시겠습니까?

해결법

  1. ==============================

    1.읽기 데이터 읽기이 순간에 최선을 다하고 것을 보장 읽도록 분리 레벨이 최선을 다하고 있습니다. 그것은 단순히 중간, 커밋, '더러운'읽기를 보는 독자를 제한합니다. IT는 읽은 후 트랜잭션을 다시 문제 읽기 경우, 동일한 데이터를 찾을 수, 데이터 변화에 무료입니다 어떠한 약속도하지 않습니다.

    읽기 데이터 읽기이 순간에 최선을 다하고 것을 보장 읽도록 분리 레벨이 최선을 다하고 있습니다. 그것은 단순히 중간, 커밋, '더러운'읽기를 보는 독자를 제한합니다. IT는 읽은 후 트랜잭션을 다시 문제 읽기 경우, 동일한 데이터를 찾을 수, 데이터 변화에 무료입니다 어떠한 약속도하지 않습니다.

    반복 읽기는의 보장에 추가로 최선을 다하고 수준을 읽어, 그것은 또한 모든 데이터는 트랜잭션이 다시 같은 데이터를 읽는 경우, 그것은 변경되지 않은 장소에 이전에 읽은 데이터를 찾을 수, 변경할 수 없습니다 읽어 보장, 높은 격리 수준이다 , 사용 가능한 읽을 수 있습니다.

    다음 격리 수준은 직렬화는 더욱 강력한 보장을하지 : 모든 것을 반복뿐만 아니라이 보장 읽기에, 또한 새로운 데이터가 후속 읽기 볼 수 없습니다 보장합니다.

    당신이 한 행과 열 C와 테이블 T를 말해봐,이 값이 '1'이 말한다. 그리고 당신은 다음과 같은 간단한 작업을 고려 :

    BEGIN TRANSACTION;
    SELECT * FROM T;
    WAITFOR DELAY '00:01:00'
    SELECT * FROM T;
    COMMIT;
    

    즉 문제 두 가지가 그들 사이에 1 분 지연, 테이블 T에서 읽는 간단한 작업입니다.

    당신은 그들이 당신을 위해 쉽게 생활을 할 수있는 동안 위의 논리가 빠르게, 그 SERIALIZABLE 트랜잭션을 실현할 수 있습니다 따른다면 그들이 그 누구도, 수정하지 삭제하거나 어떤 행을 삽입 할 수 있습니다 요구하기 때문에, 항상 완벽하게, 모든 가능한 동시 작동을 차단하고 있습니다. 닷넷 System.Transactions를 범위의 기본 트랜잭션 격리 수준은 직렬화, 이것은 일반적으로 한심한 성능 결과가 설명합니다.

    그리고 마지막으로, 또한 SNAPSHOT 격리 수준이있다. SNAPSHOT 격리 수준은 직렬화와 같은,하지만 더 동시 트랜잭션이 데이터를 수정할 수 없음을 요구함으로써 동일한 보장을합니다. 대신 세계 (그것의 자신의 '스냅 샷')의 그것의 자신의 버전을 확인하기 위해 모든 독자를 강제로. 이 동시 업데이트를 차단하지 않는 한이뿐만 아니라 매우 확장에 대해 프로그램에 매우 쉽게이를 수 있습니다. 별도의 서버 자원 소비 그러나, 그 장점은 가격으로 제공됩니다.

    보충 읽기 :

  2. ==============================

    2.데이터베이스의 상태는 트랜잭션의 시작에서 유지됩니다. 당신이 session1에 값을 검색 할 경우, 동일한 결과를 반환합니다 session1에서 다시 검색, 세션 2에서 그 값을 업데이트합니다. 읽기는 반복이다.

    데이터베이스의 상태는 트랜잭션의 시작에서 유지됩니다. 당신이 session1에 값을 검색 할 경우, 동일한 결과를 반환합니다 session1에서 다시 검색, 세션 2에서 그 값을 업데이트합니다. 읽기는 반복이다.

    session1> BEGIN;
    session1> SELECT firstname FROM names WHERE id = 7;
    Aaron
    
    session2> BEGIN;
    session2> SELECT firstname FROM names WHERE id = 7;
    Aaron
    session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
    session2> SELECT firstname FROM names WHERE id = 7;
    Bob
    session2> COMMIT;
    
    session1> SELECT firstname FROM names WHERE id = 7;
    Aaron
    

    트랜잭션의 컨텍스트 내에서, 당신은 항상 가장 최근에 최선을 다하고 값을 검색합니다. 세션 2에서 수정 된 당신이 session1에 값을 검색 할 경우, 세션 2에서 업데이트 한 다음 session1again에서 검색, 당신은 가치를 얻을 것이다. 그것은 마지막으로 커밋 된 행을 읽습니다.

    session1> BEGIN;
    session1> SELECT firstname FROM names WHERE id = 7;
    Aaron
    
    session2> BEGIN;
    session2> SELECT firstname FROM names WHERE id = 7;
    Aaron
    session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
    session2> SELECT firstname FROM names WHERE id = 7;
    Bob
    session2> COMMIT;
    
    session1> SELECT firstname FROM names WHERE id = 7;
    Bob
    

    말이된다?

  3. ==============================

    3.간단히 대답은 내 독서에 따라이 스레드에 이해하고 @이 간단한 시나리오를 기반으로 대답 레무스-rusanu :

    간단히 대답은 내 독서에 따라이 스레드에 이해하고 @이 간단한 시나리오를 기반으로 대답 레무스-rusanu :

    두 프로세스 A와 B가있다 프로세스 B는 표 X를 읽고 프로세스 A는 테이블 X 쓰고있다 프로세스 B는 다시 표 X를 읽고

  4. ==============================

    4.이미 허용 답을 가지고 있지만, 나는 그들이 SQL Server의 잠금 동작을 변경하는 방법의 측면에서이 두 가지 격리 수준으로 생각하고 싶다 오래된 질문입니다. 이것은 내가처럼 교착 상태를 디버깅하는 사람들을 위해 도움이 될 수 있습니다.

    이미 허용 답을 가지고 있지만, 나는 그들이 SQL Server의 잠금 동작을 변경하는 방법의 측면에서이 두 가지 격리 수준으로 생각하고 싶다 오래된 질문입니다. 이것은 내가처럼 교착 상태를 디버깅하는 사람들을 위해 도움이 될 수 있습니다.

    READ COMMITTED (기본값)

    공유 잠금은 SELECT에서 촬영하고 때 SELECT 문 완료를 발표한다. 이 시스템이 더 더러운 커밋되지 않은 데이터를 읽지 않습니다 있다는 것을 보장 할 수있는 방법이다. 기타 거래는 여전히 SELECT 완료 후 트랜잭션이 완료되기 전에 기본 행을 변경할 수 있습니다.

    REPEATABLE READ

    공유 잠금은 SELECT에서 촬영하고 트랜잭션이 완료 후에 만 ​​해제됩니다. 이 시스템이 (가 트랜잭션이 완료 될 때까지 잠겨 있기 때문에) 읽기 값이 트랜잭션 동안 변경되지 않습니다 보장 할 수있는 방법이다.

  5. ==============================

    5.간단한 다이어그램이 의심을 설명하려고합니다.

    간단한 다이어그램이 의심을 설명하려고합니다.

  6. ==============================

    6.내가 빨리 (YouTube에서 kudvenkat 덕분에) 분리 레벨 사이의 차이를 기억하고자 할 때 나는 그것을 참고로 저를 도움이 그림이 유용 할 수 있다고 생각

    내가 빨리 (YouTube에서 kudvenkat 덕분에) 분리 레벨 사이의 차이를 기억하고자 할 때 나는 그것을 참고로 저를 도움이 그림이 유용 할 수 있다고 생각

  7. ==============================

    7.하지만 전체 테이블에, 튜플에 대한 반복 읽기 안부의 반복을주의하시기 바랍니다. ANSC 분리 레벨에서, 가상 절은 두 가지 상이한 리턴 결과 세트를 리턴 할 수있는 위치가 동일한 수단으로 테이블을 판독하는 판독 발생할 수있는 이상. 말 그대로, 그것은 반복이 아니다.

    하지만 전체 테이블에, 튜플에 대한 반복 읽기 안부의 반복을주의하시기 바랍니다. ANSC 분리 레벨에서, 가상 절은 두 가지 상이한 리턴 결과 세트를 리턴 할 수있는 위치가 동일한 수단으로 테이블을 판독하는 판독 발생할 수있는 이상. 말 그대로, 그것은 반복이 아니다.

  8. ==============================

    8.초기 허용 솔루션에 대한 내 관찰.

    초기 허용 솔루션에 대한 내 관찰.

    RR에서 (기본 MySQL의) - 한 텍사스가 열려 있고 SELECT 이전 텍사스 (바로 중단됩니다 새로운 텍사스에서 실제로 삭제 성명에서) 커밋 될 때까지 다른 텍사스 이전 READ 결과 집합에 속하는 행을 삭제할 수 없습니다, 해고 된 경우 그러나 다음 텍사스는 아무 문제없이 테이블의 모든 행을 삭제할 수 있습니다. 이 커밋 될 때까지 BTW, 이전 텍사스에서 다음 READ 여전히 이전 데이터를 볼 수 있습니다.

  9. from https://stackoverflow.com/questions/4034976/difference-between-read-commit-and-repeatable-read by cc-by-sa and MIT license