happy-developers / dev-interview

1 stars 1 forks source link

[DB] 문장 수준 읽기 일관성이란 무엇일까요? 벤더사들은 이를 어떻게 구현하고 있을까요? #40

Open leeho1110 opened 1 year ago

leeho1110 commented 1 year ago

문장 수준 읽기 일관성이란 무엇일까요? 벤더사들은 이를 어떻게 구현하고 있을까요?

키워드

Undo Segment, Shared Lock, Statement-Level

leeho1110 commented 1 year ago

문장 수준 읽기 일관성(Statement-Level Read Consistency)?

문장 수준(Statement-Level), 읽기(Read), 일관성(Consistency), 3개의 단어가 하나로 합쳐진 단어입니다. 이 단어가 어떤 뜻인지 하나씩 살펴보며 모두 합쳐졌을 때 어떤 의미를 갖는지 살펴보겠습니다.

우선 문장 수준, Statement Level은 이 예제를 살펴보며 확인해봅시다. 학생 테이블에서 A라는 학생을 조회하는 쿼리(Q1)를 요청한다면 이는 하나의 DBMS에게 전달되는 Statement가 됩니다. A라는 학생의 학부를 B학부로 변경하는 수정 쿼리(Q2)도 역시 하나의 Statement가 되죠. 그렇다면 Statement-Level은 쿼리가 주인공이 되는 쿼리 수준, 쿼리의 라이프사이클에서라는 말로 이해해도 될 것 같습니다.

읽기(Read)는 아주 간단한 단어니 데이터베이스의 로우를 조회한다는 의미로 받아들일 수 있겠죠. 일관성(Consistency)은 같은 마음, 사랑이 어떻게 변하니?(실패한 드립입니다) 라는 대답에 항상 같은 답을 주는 것을 말하죠. 쿼리에서는 항상 동일한 응답을 전달한다는 것을 의미할 것 같습니다.

자 그렇다면 세 개를 합쳐봅시다. 위 Q1, Q2 쿼리가 실행되는 상황을 살펴보겠습니다. 이 때 컴퓨터의 성능이 너무 안좋아 Q1에 5초가 걸렸다고 가정하겠습니다. 그런데 Q2가 5초안에 실행되어 완료됐다면 우린 어떤 결과를 보여주는 것이 맞을까요? Q1의 검색이 시작된 시점에 존재했던 데이터를 보여줘야 합니다. 그래야 일관성이 있으니까요.

즉 Statment-Level Read Consistency이란 어떠한 쿼리(단일 SQL)가 시작되는 시점을 기준으로 쿼리가 실행되는 라이프사이클 내에서 조회에서는 항상 같은 데이터를 유지해야한다는 것을 의미합니다.

이는 트랜잭션 격리 수준이 Read Uncommited 인 경우 발생할 수 있는 Dirty Read를 방지합니다. 위에서 언급한 문장 수준 일관성을 가능케 하는 구현은 여러 가지가 존재합니다. 대표적으로 Oracle의 Undo, MySQL의 Shared Lock이 있습니다.


Oracle Undo

Undo의 목적은 문장 수준 읽기 일관성뿐만 아니라 트랜잭션의 롤백과 복구 단계에서도 필요합니다. 롤백과 복구를 위해 필요한 정보가 무엇일까요? 바로 트랜잭션이 발생시킨 데이터의 변경입니다. 다른 DBMS와는 달리 Undo를 통해 완벽한 문장 수준 읽기 일관성을 보장합니다.

Undo 레코드는 Oracle 9i부터 Automatic Undo Management에 의해 관리되며 트랜잭션별로 Undo 세그먼트에 저장됩니다. Undo 세그먼트는 트랜잭션에 관한 정보를 저장하는 Undo 헤더, 변경된 로우와 관한 정보를 저장하는 Undo 레코드, Undo 레코드 체인을 유지하는 포인터인 Last UBA(Undo Block Address)로 이뤄져 있습니다.

Oracle에서의 문장 수준 읽기 일관성에 대한 내용이 궁금하면 위 링크를 참조해보시죠.


MySQL Shared Lock

오라클은 Undo를 통해서 문장 수준 읽기 일관성에서 완벽함을 보장하지만, MySQL에선 그렇지 않습니다. Undo는 특정 시점의 기록을 남기고 이를 참조하지만, Shared Lock은 단순히 해당 시점에서 변경이 일어나지 못하게 막는다는 차이점이 존재하기 때문이죠. 물론 트랜잭션의 Isolation level을 높히거나 Table Lock을 활용하여 이를 보장할 수 있지만 동시성이 하락하는 부작용이 생깁니다.


참고자료