◆ DML문장의 쿼리 수행 절차(UPDATE문)
UPDATE문은 DB Cache에 필요한 데이터를 갖다 놓는 단계까지는 SELECT문과 비슷하다. 하지만 그 이후부터는 다르다. 아래 그림은 다른 부분만을 설명한다.

① 선로그기법(Log Ahead) 적용으로 먼저 리두로그버퍼에 이순신의 sal을 500으로 수정한다는 기록을 한다.
② 수정 전의 값인 100을 언두 세그먼트에 저장시킨다.
③ DB Cache에 수정된 값인 500으로 바꾼다.



오라클은 선로그기법(Log Ahead)이라고 해서 데이터 변경이 일어날 때 항상 리두로그에 먼저 기록한다.
언두는 원래는 DB Cache 안에 있는 것이다. 그림은 이해를 돕기 위해 따로 빼놓은 것일 뿐 혼동하지 말라.

리두로그버퍼는 일지, 장부 또는 일기와 같은 것으로 DB 내에서 데이터가 변경이 생기는 모든 것은 다 기록한다.
delete, insert, create index, create table 과 같은 DML이나 DDL은 모두 리두로그에 기록이 된다.
단, select는 단순히 데이터를 조회하는 것일 뿐이므로 기록이 되지 않는다.

위의 그림에서 A사용자가 update를 날려서 현재 DB Cache에는 이순신의 연봉이 500으로 변경되었다. 하지만 아직 커밋은 날리지 않은 상태이다.
이때 B사용자가 이순신의 데이터를 조회하는 쿼리를 날리면 이순신의 연봉값은 무엇이 나올까? 답은 100이다. 왜냐하면 현재 A사용자가 이순신의 데이터를 수정하고 있는 중이므로 해당 데이터의 권한은 A사용자에게 있다고 볼 수 있다. A 사용자가 커밋을 날리기 전까지는 절대 이순신의 연봉을 500으로 변경한 것에 대해 다른 사용자들이 알면 안된다.
그렇다면 어떻게 B사용자는 바뀌기 전 값인 100을 볼 수 있는 것일까? 그것은 CR블록이라고 하는 오라클의 읽기일관성(Consistent Read) 때문이다.

Posted by 겨울섬
,