트랜잭션 DML 과정

Inyeob Kim·2023년 3월 26일

  1. DML문을 실행하면 Redo 로그 버퍼에 변경 사항을 기록한다.

  2. 버퍼블록에서 데이터를 변경(레코드 추가/수정/삭제)한다. 물론, 버퍼캐시에서 블록을 찾지 못하면, 데이터파일에서 읽는 작업부터 한다.

  3. 커밋한다.

  4. LGWR(Log Writer) 프로세스가 Redo 로그버퍼 내용을 로그 파일에 일괄 저장한다.

  5. DBWR(Database Writer) 프로세스가 변경된 버퍼블록들을 데이터파일에 일괄 저장한다.

Lock과 DML 성능

Lock은 DML 성능에 직접적인 영향을 미친다. Lock을 필요 이상으로 자주, 길게 사용하거나 레벨을 높일수록 DML 성능은 느려진다. 그렇다고 Lock을 너무 적게, 짧게 사용하거나 필요한 레벨 이하로 낮추면 데이터 품질이 나빠진다. 성능과 데이터 품질이 모두 중요한데, 이 둘은 트레이드 오프 관계여서 절충점을 찾기가 어렵다.
동시성 제어란, 동시에 실행되는 트랜잭션 수를 최대화(고성능)하면서도 입력, 수정, 삭제, 검색 시 데이터 무결성을 유지(고품질)하기 위해 노력하는 것을 말한다.

DB 버퍼캐시

DB에 접속한 사용자를 대신해 모든 일을 처리하는 서버 프로세스는 버퍼캐시를 통해 데이터를 읽고 쓴다. 버퍼캐시에서 변경된 블록(Dirty 블록)을 모아 주기적으로 데이터파일에 일괄 기록하는 작업은 DBWR 프로세스가 맡는다. 일을 건건이 처리하지 않고 모았다가 한번에 일괄(Batch) 처리한다.

Redo 로그버퍼

버퍼캐시는 휘발성이므로 DBWR 프로세스가 Dirty 블록들을 데이터파일에 반영할 때까지 불안한 상태라고 생각할 수 있다. 하지만 버퍼캐시에 가한 변경사항을 Redo 로그에도 기록해 두었으므로 안심해도 된다. 버퍼캐시 데이터가 유실되더라도 Redo 로그를 이용해 언제든 복구할 수 있기 때문이다.
그런데 Redo 로그도 결국 파일이다. Append 방식으로 기록하더라도 디스크 I/O는 느리다. Redo 로깅 성능 문제를 해결하기 위해 오라클은 로그버퍼를 이용한다. Redo 로그파일에 기록하기 전에 먼저 로그버퍼에 기록한다. 로그버퍼에 기록한 내용은 나중에 LGWR 프로세스가 Redo 로그파일에 일괄 기록한다.

커밋 = '저장 버튼'

profile
코어뱅킹 주니어 개발자

0개의 댓글