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 |