Read Consistency: Databases for Developers #18

Google은 데이터를 쿼리하는 방법에 대해 많이 이야기했습니다 그리고 그것을 바꾸는 방법에 대해 조금

하지만 누군가를 읽는 동안 다른 사람이 데이터를 변경하면 어떻게됩니까? 그들의 업데이트를 언제 보십니까? 쿼리 결과가 부분적으로 변경 될 수 있습니까? 과 이것은 당신의 코드에서 무엇을 의미합니까? 이제는 독서 현상에 대해 이야기 할 때입니다 그리고 격리 수준 데이터베이스를 사용할 때주의해야 할 세 가지 유형의 현상이 있습니다

더티 읽기 반복 불가능하거나 퍼지 읽기 그리고 유령이 읽습니다 이는 한 사람이 다른 사람이 데이터를 읽는 동안 발생할 수있는 문제를 설명합니다 그것을 바꾼다

더러운 읽기는 그들이 말하는 것처럼 나쁘다 변경 사항을 볼 수있는 곳입니다 그들이 그것을 저지르기 전에 다른 누군가에 의해! 따라서 거래를 진행하는 동안 테이블을 읽을 수 있습니다 그러면 불완전한 그림을 얻을 수 있습니다 그러나 더 나쁜 경우에는 변경 사항을 롤백 할 수 있습니다

따라서 데이터베이스에 저장되지 않은 변경 사항을 읽을 수 있습니다 이것은 모든 종류로 이어질 수있다 일관성이없고 잘못된 결과가 나오기 때문에 피해야합니다 비 반복적 또는 퍼지 읽기는 업데이트로 인해 발생하며 동일한 쿼리가 반환 될 수 있습니다 다른 결과

색상으로 내 벽돌을 계산한다고 가정 해 보겠습니다 그래서 우리는 3 개의 파란색과 3 개의 빨간색 이렇게하면 누군가 다른 파란색 벽돌로 변경됩니다 빨간 쿼리를 다시 실행하면 두 개의 파란색 벽돌과 네 개의 빨간색이 생깁니다

팬텀 읽기도 비슷한 문제입니다 그러나 다른 사람들이 행을 삽입하여 발생합니다 그래서 네가 이제 우리가 다시 계산 한 또 다른 읽기 벽돌을 추가하면 두 개의 파란색 벽돌과 다섯 개의 빨간 벽돌이 생깁니다 그렇다면 왜 반복 불가능하고 유령이 문제를 읽는가? 결국 누군가가 저장하면 테이블을 바꾼다면, 그것들을보고 싶을 것입니다, 그렇죠? 글쎄, 반드시! 나는이 새와 같이 내가 여기 벽돌로 만들 수있는 다양한 것들에 대한 지시를했다 모델

지금, 내가 항상 벽돌을 만들었는지 확인하기 위해, 내가하고 싶은 것을하고 싶다 여기에이 벽돌들을 저장합니다 그래서 우리는 하나의 길고 푸른 하나, 짧은 푸른 하나, 빨간, 오렌지, 그리고 마지막으로 두 개의 노란색을 가지고 있습니다 이제는 상자에 넣었지만 시간이 지나면 그 상자를 훔치려 고합니다 다른 용도로 사용하십시오

그래서 나는 그 안에 무엇이 있는지를 알고 싶습니다 거기에 무엇이 있는지 확인하십시오 그래서 뚜껑에 내용을 쓰려고합니다 그리고, 나에게 시간을 절약하기 위해, 내가 할 일은 여기서 지침의 값을 복사하는 것입니다 그러나, 내가하기 전에, 다른 누군가는 녹색을 위해 파란 벽돌을 교환하면서 정의를 변경합니다

그리고 빨간 색을 더한다 이 새 값을 상자에 복사하면 합계가 일치하지 않습니다 내용! 나는이 모든 것을 하나의 거래로하고있다 그래서 나는 모델 정의가 동일하게 유지되기를 바란다 모든 벽돌을 상자에 넣고 뚜껑에 필요한 것을 쓸 때까지 이 문제를 해결하려면 두 번째 쿼리가 첫 번째 쿼리를 실행 한 시점의 데이터를 반환해야합니다

시작되었습니다 잠시 후에이 작업을 수행하는 방법을 살펴 보겠습니다 그러나 여기서 중요한 문제는 우리는 정보를 중복 시켰습니까? 편의를 위해 상자의 내용물을 뚜껑에 보관했습니다 어느 것이 실제 내용과 동기화되지 않을 수 있습니다 이런 일은 실제로 일어날 수 있습니다

주문 및 송장과 같은 것들을 가진 어플리케이션 품목 수준 가격뿐만 아니라 사람들은 종종 전반적인 가치를 저장하려고합니다 이것은 할 수있다 일관성없는 가치와 불행한 고객으로 쉽게 이어집니다! 지금까지 여러 번 동일한 테이블을 쿼리 할 때 발생할 수있는 문제에 대해 이야기했습니다 거래 내에서

그러나 이러한 현상은 단일 쿼리 내에서 가능합니다 에 이것이 어떤 영향을 미치는지 보시고, 여기에 벽돌을 세기로 돌아가 보겠습니다 먼저 세 개의 파란색 벽돌을 읽습니다 그러나이 시점에서 다른 누군가가 색을 바꾼다 이 붉은 색과 푸른 색 벽돌 중

우리는 남은 것들을 계속 계산하여 푸른 색 4 개를주었습니다 그리고 두 개의 빨간색 따라서 퍼지 읽기 때문에 테이블에 저장되지 않은 총이 있습니다! 그리고 누군가가 완성되기 전에 다른 붉은 벽돌을 추가하면 우리는 이제 유령을 읽게됩니다 우리 셋은 빨간색이에요 노출되는 이러한 영향 중 SQL을 작성하는 방법에 영향을 미칩니다

당신을 도울 수 있도록 SQL 표준은 네 가지 분리 레벨을 정의합니다 이들은 커밋되지 않은 채로 읽혀 지므로 이러한 모든 문제가 허용됩니다 완결 된 읽기 전용 더티 읽기를 중지합니다 다음은 반복 읽기가 가능하며 퍼지 읽기도 중지됩니다 그리고 마지막으로 직렬화가 가능하여 이러한 모든 문제를 방지 할 수 있습니다

대부분의 데이터베이스는 거래가 사용하는 레벨을 정의하십시오 따라서 serializable이 이러한 모든 문제를 해결한다면 왜 isolation level을 설정하지 않고, 끝내라 글쎄,이 응용 프로그램을 동시에 사용할 수있는 수를 줄일 수 있습니다! serializable에서 다른 사용자가 변경 한 행을 시도하고 업데이트하거나 삭제하면 거래가 시작되면 오류가 발생합니다 그렇게하면 결정을해야합니다 보석금을 내고 사용자에게 이야기하고 거래를 시도하십시오

다시, 또는 다른 것을합니까? 여기에 고정 된 대답이 없습니다 비즈니스 요구 사항에 따라 올바른 내용은 무엇입니까? 및 귀하의 응용 프로그램 그러나 어떤 경우에도 데이터베이스는 더 많은 작업을 수행하고 처리 횟수는 줄어 듭니다 업무 따라서 원하는 처리량을 얻으려면 낮은 격리 수준을 사용해야 할 수 있습니다 수평

Oracle Database는 커밋되고 직렬화 가능한 읽기 만 구현합니다 기본 값을 읽음으로써 저지른 따라서 트랜잭션 내에서 동일한 명령문을 다시 실행하면 다른 결과를 얻을 수 있습니다 이를 피하려면 세션을 변경하여 격리 수준을 직렬 가능으로 설정하십시오 이 픽스들 트랜잭션의 첫 번째 명령문이 시작될 때까지의 모든 쿼리 결과

그래서 당신은 다른 사람들에 의한 변화를 보지 못합니다 거래가 끝나면 다음을 볼 수 있습니다 다른 사람들이 한 일 다행히 Oracle Database의 진술 수준에서이 점에 대해 걱정할 필요가 없습니다 다중 버전 동시성 제어 (MVCC)라는 환상적인 기능이 있습니다

이것은 문장 수준을 제공합니다 일관성은 읽기 커밋에서도 마찬가지입니다 따라서 쿼리의 결과는 항상 시작 시간 아무리 길게 달렸는지 또는 다른 사람들이 변화시키는 것이 무엇이든 상관없이 어떤 현상도 적용되지 않습니다 결과는 동일하게 유지됩니다! 다른 데이터베이스 공급 업체에서는이를 다르게 처리합니다

표준이 명확하게 나타나지만, 거기 그것을 구현하는 다른 방법들이 있습니다! 특히, 읽기에 커밋 된 문장 수준의 일관성이 없을 수 있습니다 대신, 쿼리 다른 사용자가 쓰기를 차단할 수 있습니다 Oracle Database에서는 이런 일이 발생하지 않습니다 독자는 결코 작가를 차단하지 않습니다 작가는 독자를 결코 차단하지 않습니다

이러한 구현 세부 사항은 세션이 서로를 차단하고 차단할 때 큰 영향을 미칩니다 어떤 진술 모든 데이터베이스에서 격리 수준이 어떻게 작동하는지 읽고 이해해야합니다 너는 사용한다 하지만 오라클 데이터베이스에서는 반복 불가하고 유령 읽기 문제 만 고려하면됩니다

트랜잭션에서 동일한 테이블을 여러 번 쿼리합니다 마지막으로 Oracle Database는 또 다른 모드를 구현합니다 읽기 전용 이것은 같은 방식으로 작동합니다 직렬화 가능함

모든 쿼리의 결과는 동일한 시점으로 고정됩니다 그러나, 쿼리 만 실행할 수 있다는 추가 제한이 있습니다 행을 변경하려고하면 오류가 발생합니다 이것은 보고서를 실행할 때 편리 할 수 ​​있습니다 특별히 모든 쿼리가 동일한 시점에 일관성이 있는지 확인해야하는 경우 하지만 Oracle Database를 사용할 때 일반적으로 커밋 된 읽기의 기본값을 고수 할 수 있습니다

같은 테이블에 여러 번 액세스하는 트랜잭션이 있으면 한 사람이 그것을 읽고 다른 사람이 동시에 변화하는 동안 일어날 일 방법 이 오류는 수백만 개의 오류가 발생했을 때만 나타나는 오류를 추적하기 어렵게합니다 사람들이 응용 프로그램을 사용합니다! 보고 주셔서 감사합니다! 비디오를 만들려는 SQL 주제가 있습니까? 의견을 통해 알려주십시오 과 향후 업데이트를 구독하십시오