728x90
반응형

DB 세션

  • 데이터베이스 세션이란 데이터베이스 접속을 시작으로 여러 작업을 수행한 후 접속 종료까지의 전체 기간을 의미합니다.
  • 세션 안에는 여러 개의 트랜잭션이 존재할 수 있고, 여러 곳에서 데이터베이스를 접속할 경우, 많은 세션이 동시에 연결될 수 있습니다.

트랜잭션

  • 트랜잭션이란 데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 작업 단위입니다.

Commit

  • Commit이란 Transaction의 처리 과정을 데이터베이스에 정상적으로 처리하겠다고 확정하는 명령어입니다.
  • Commit을 수행하면 하나의 트랜잭션 과정을 종료하게 됩니다.

Rollback

  • Rollback이란 작업 중 문제가 발생했을 때, Transaction의 처리 과정에서 발생한 변경 사항을 취소하고, Transaction 과정을 종료시켜 Transaction으로 처리가 시작되기 이전의 상태로 되돌리는 명령어를 의미합니다.
  • 이전 COMMIT한 곳까지만 복구합니다.

Auto Commit 설정

  • DDL문에는 CREATE, ALTER, DROP과 같은 명령어들이 있는데 이들 모두는 자동으로 COMMIT을 실행합니다.

트랜잭션의 성질 ACID

  • ACID는 하나의 transaction의 안전성을 보장하기 위해 필요한 성질입니다. 각각은 Atomicity, Consistency, Isolation, Durability를 의미합니다.
  • Atomicity는 원자성으로 한 Transaction의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말합니다.
    • 하나의 거래에서 계좌 출금과 입금은 모두 성공하거나 전부 실패해야 합니다.
  • Consistency는 일관성으로 Transaction의 이전과 이후, 데이터베이스 상태는 이전과 같이 유효해야 한다는 성질입니다.
    • 제약 조건 중 모든 고객은 반드시 이름이 있어야 한다는 제약이 있다면 이름 없는 새로운 고객 추가 쿼리 같은 것은 일관성이 유지되지 않는 쿼리입니다.
  • Isolation은 격리성으로 모든 Transaction은 다른 Transaction으로부터 독립되어야 한다는 뜻입니다.
  • Durability은 지속성으로 하나의 Transaction이 성공적으로 수행되었다면, 해당 Transaction에 대한 로그가 남아야하는 성질을 말합니다.
  • 만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 합니다.

트랜잭션 격리 수준

  • Transaction의 격리 수준(Isolation Level)이란 여러 Transaction이 동시에 처리될 때, 특정 Transaction이 다른 Transaction에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것입니다.
  • 트랜잭션의 격리 수준은 수준이 높은 순서대로 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED가 존재합니다.

트랜잭션 격리 수준 READ UNCOMMITTIED

  • READ UNCOMMITTED는 커밋하지 않은 데이터 조차도 접근할 수 있는 격리 수준입니다.
  • 다른 트랜잭션의 작업이 커밋 또는 롤백되지 않아도 즉시 보이게 됩니다.
  • 어떤 트랜잭션의 작업이 완료되지 않았는데도, 다른 트랜잭션에서 볼 수 있는 부정합 문제를 Dirty Read라고 합니다.

Dirty Read

  • 어떤 트랜잭션의 작업이 완료되지 않았는데도, 다른 트랜잭션에서 볼 수 있는 부정합 문제를 Dirty Read라고 합니다.
  • Dirty Read 상황은 시스템에 상당한 버그를 초래할 수 있기 때문에 MySQL을 사용한다면 최소한 READ COMMITTED이상의 격리 수준을 사용해야 합니다.

트랜잭션 격리 수준 READ COMMITTED

  • READ COMMITTED는 커밋된 데이터만 조회할 수 있습니다.
  • REPEATABLE READ에서 발생하는 Phantom Read에 더해 Non-Repeatable(반복 읽기 불가능) 문제까지 발생합니다.

READ COMMITTED에서 발생할 수 있는 Non-Repeatable Read(반복 읽기 불가능)

  • READ COMMITTED에서 반복 읽기를 수행하면 다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라질 수 있는 것을 반복 읽기 불가능이라고 합니다.
  • 하나의 트랜잭션에서 동일한 데이터를 여러 번 읽고 변경하는 작업이 금전적인 처리와 연결되면 문제가 생길 수 있습니다.

트랜잭션 격리 수준 REPEATABLE READ

  • RDBMS는 변경 전의 레코드를 백업해두어서 변경 전과 변경 후의 데이터가 모두 존재합니다. 이걸 MVCC(Multi-Version Concurrency Control, 다중 버전 동시성 제어)라고 부릅니다.
  • 이를 통해 서로 다른 트랜잭션 간에 접근할 수 있도록 고유한 트랜잭션 번호가 존재하는데, 백업 레코드에서는 어느 트랜잭션에 의해 백업되었는지 트랜잭션 번호를 함께 저장합니다.
  • REPEATABLE READ는 MVCC를 이용해 한 트랜잭션 내에서 동일한 결과를 보장하지만, 새로운 레코드가 추가되는 경우에 부정합이 생길 수 있습니다.
  • REPEATABLE READ는 어떤 트랜잭션이 읽은 데이터를 다른 트랜잭션이 수정하더라도 동일한 결과를 반환할 것을 보장합니다.

유령 읽기

  • 유령 읽기란 다른 트랜잭션에서 수행한 작업에 의해 레코드가 안보였다 보였다 하는 현상을 의미합니다.
  • 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견될 수 있는 현상을 의미합니다.
  • 유령 읽기는 잠금이 사용되는 경우에 발생할 수 있습니다.
  • 일반적으로 MySQL의 REPEATABLE READ에서는 Phantom Read가 발생하지 않습니다.

쓰기 잠금과 읽기 잠금

  • 쓰기 잠금은 SELECT ... FOR UPDATE 구문으로 사용합니다.
  • 읽기 잠금은 SELECT FOR SHARE 구문을 사용해야 합니다.
  • 락은 트랜잭션이 커밋 또는 롤백될 때 해제됩니다.

트랜잭션 격리 수준 SERIALIZABLE

  • 가장 엄격한 격리 수준으로, 이름 그대로 트랜잭션을 순차적으로 진행시킵니다.
  • 여러 트랜잭션이 동일한 레코드에 동시 접속할 수 없으므로 어떠한 데이터 부정합 문제도 발생하지 않습니다.
  • 하지만, 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 떨어집니다.

오라클에서는 READ COMMITTED를 기본으로 사용하고 MYSQL에서는 REPEATABLE READ를 기본으로 사용합니다

DB 동시성 제어(Concurrency Control)

  • 동시성 제어란 동시에 실행되는 여러 개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어하는 기법입니다.
  • 트랜잭션의 직렬성을 보장하고, 데이터의 무결성 및 일관성을 보장하여 줍니다.

동시성 제어를 하지 않은 경우 발생하는 문제점

갱신 손실 문제

  • 하나의 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 갱신이 무효화가 되는 것을 의미합니다.
  • 두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생합니다.

DB 락(Lock)

  • Lock이란 트랜잭션 처리의 순차성을 보장하기 위한 방법으로 데이터의 무결성과 일관성을 지키기 위해 Lock을 사용합니다.

Lock의 종류

  • Shared Lock(공유 락) : 공유락은 데이터를 변경하지 않는 읽기 명령에 대해 주어지는 락입니다.
  • Exclusive Lock(베타 락) : 데이터에 변경을 가하는 명령들에 대해 주어지는 락으로 다른 세션이 해당 자원에 접근하는 것을 막습니다.
  • Update Lock(업데이트 락) : 데이터를 수정하기 위해 베타 락을 걸기전에 데드 락을 방지하기 위해 사용되는 락입니다.
  • Intent Lock(내제 락) : 내제 락은 사용자가 요청한 범위에 대한 락을 걸 수 있는지 여부를 빠르게 파악하기 위해 사용되는 락입니다.

Blocking

  • 블로킹은 Lock간의 경합이 발생해서 특정 트랜잭션이 작업을 진행하지 못하고 멈춰선 상태를 말합니다.
  • 베타-베타, 베타-공유 간에 블로킹을 발생시킬 수 있습니다.

DB 데드락

  • 데드락은 교착상태라고 하며 교착상태는 두 트랜잭션이 각각 Lock을 설정한 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지 않게 되는 상태를 말합니다.

데이터베이스 장애의 유형

  • 트랜잭션 장애 : 트랜잭션의 실행 시 논리적인 오류로 발생할 수 있는 에러 상황(잘못된 데이터 입력, 데이터의 부재, 오버플로우, 자원의 한계 초과 요청)
  • 시스템 장애 : H/W 시스템 자체에서 발생할 수 있는 에러 상황
  • 미디어 장애 : 디스크 자체의 손상으로 발생할 수 있는 에러 상황

DB 회복

  • 데이터베이스를 장애가 발생했던 이전의 상태로 복구시켜서 일관된 데이터베이스 상태를 만드는 것을 의미합니다.

REDO, UNDO

  • REDO는 무언가를 다시 하는 것이고, UNDO는 무언가를 되돌리는 것입니다.
  • 둘 다 복구를 하지만, REDO는 복구를 할 때 사용자가 했던 작업을 그대로 하지만, UNDO는 사용자가 했던 작업을 반대로 진행합니다.

체크포인트 회복 기법

  • 회복 기법을 간단하게 하기 위해서 사용하는 방법이 체크포인트 회복 기법입니다.
  • 체크 포인트 이전에 커밋 기록이 있는 경우 아무 작업이 필요 없고,
  • 체크 포인트 이후에 커밋 기록이 있는 경우 REDO를 진행하고
  • 체크 포인트 이후에 기록이 없는 경우 UNDO를 진행합니다.

MySQL InnoDB의 기본 트랜잭션 고립 수준

  • REPEATABLE READ입니다.
728x90
반응형

'CS' 카테고리의 다른 글

[네트워크] TCP  (3) 2023.11.22
[네트워크] UDP  (0) 2023.11.21
[네트워크] DNS  (0) 2023.11.21
Token과 Session, Cookie와 Local Storage  (0) 2023.02.13

+ Recent posts