1. 트랜잭션(Transaction)이란?
트랜잭션은 DBMS에서 데이터의 일관성을 보장하기 위해 사용되는 논리적인 작업의 단위입니다. 쉽게 말해, 데이터베이스에서 하나의 작업을 수행하기 위한 여러 동작들을 하나로 묶은 것을 의미합니다.
예를 들어, 은행에서 돈을 이체한다고 하면
1. A계좌에서 돈을 출금한다.
2. 출금한 돈을 B계좌에 입금한다.
이 두 가지 동작은 따로따로 실행되면 안됩니다. 1번만 실행되고 2번이 실행되면 돈을 다 잃게 되기 때문입니다. 트랜잭션은 이 두 동작을 하나로 묶어서 둘 다 실행되거나, 둘 다 실행되지 않도록 보장합니다.
2. 트랜잭션의 특징(ACID)
트랜잭션은 ACID(원자성, 일관성, 독립성, 지속성)라는 특징을 갖고 있습니다.
2-1. 원자성 Atomicity
'All or Nothing'
트랜잭션은 'All or Nothing'이라는 원칙을 따릅니다. 즉, 트랜잭션의 모든 연산이 수행되거나 전혀 수행되지 않아야 합니다.
앞선 예시처럼 은행에서 계좌 이체 트랜잭션이 수행되는 경우, 출금과 입금이 모두 성공하거나 모두 실패해야 합니다.
commit
트랜잭션을 완료하고 변경 사항을 데이터베이스에 영구적으로 반영했다는 명령어입니다. 여러 쿼리(update, insert, delete)가 성공적으로 처리되었다고 확정했다는 뜻입니다.
'커밋이 수행되었다.' = '하나의 트랜잭션이 성공적으로 수행되었다.'
rollback
트랜잭션을 취소하고 변경 사항을 이전 상태로 되돌렸다는 명령어입니다. 에러나 여러 이슈 때문에 트랜잭션 전으로 돌려야 하는 상황에서 사용됩니다.
commit과 rollback으로 데이터의 무결성이 보장됩니다. 또한, 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있고 해당 작업을 그룹화할 수 있습니다.
2-2. 일관성 Consistency
일관성은 허용된 방식으로만 데이터를 변경해야 하는 것을 의미합니다. 트랜잭션이 시작되기 전과 후에 데이터베이스는 항상 일관된 상태여야 합니다. 트랜잭션이 완료된 후에도 데이터베이스는 미리 정의된 규칙, 제약 조건, 무결정 조건을 준수해야 합니다.
계좌 잔액은 항상 0 이상이어야 한다는 규칙이 있다고 가정해봅시다.(마이너스 통장 안됨)
A에게 100만원, B에게 0원이 있다고 할 때, A가 B에게 입금할 수 있는 금액은 100만원이 넘어가선 안됩니다.
2-3. 격리성 Isolation
여러 트랜잭션이 동시에 실행되는 경우, 서로에게 영향을 주지 않도록 격리되어야 합니다. 격리성은 트랜잭션 수행 시 서로 끼어들지 못하는 것을 말합니다.
예를 들어, A가 계좌에서 돈을 출금하는 동시에 B가 같은 계좌에 입금하는 경우, 두 트랜잭션은 서로의 작업을 간섭하지 않고 독립적으로 실행되어야 합니다.
여러 개의 격리 수준으로 나뉘어 격리성을 보장합니다.
격리 수준에 따라 발생하는 현상으로 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드가 있습니다.
1. Phantom Read(팬텀 리드)
한 트랜잭션 내에서 동일한 쿼리를 두 번 실행했을 때, 그 사이에 다른 트랜잭션이 데이터를 삽입하거나 삭제하여 결과 집합이 달라지는 현상입니다.
예)
1. 트랜잭션 A가 잔액 100만원 이상인 계좌 조회(결과: 3) (100 100 100)
2. 트랜잭션 B가 잔액 150만원 이상인 새로운 계좌 생성하고 커밋(데이터 삽입) (100 100 100 150)
3. 트랜잭션 A가 잔액 100만원 이상인 계좌 조회(결과: 4)
2. Non-Repeatable Read(반복 가능하지 않은 조회)
동일한 트랜잭션 내에서 같은 데이터(행)를 두 번 이상 조회했는데 그 사이에 다른 트랙잭션이 데이터를 변경하여 읽은 값이 달라지는 현상입니다.
ex)
1. 트랜잭션 T1이 계좌 잔액 100만 원을 읽음(결과: 100만 원)
2. 트랜잭션 T2가 해당 계좌에서 10만 원을 출금하고 커밋
3. 트랜잭션 T1이 다시 계좌 잔액을 읽음(결과: 90만 원)
팬텀 리드와 다른 점은 팬텀 리드는 다른 행이 선택될 수 있다는 것이고 반복 가능하지 않은 조회는 행 값이 달라질 수 있는 것입니다.
3. Dirty Read(더티 리드)
한 트랜잭션이 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 현상입니다.
ex)
1. 트랜잭션 T1이 계좌 잔액을 100만 원에서 90만 원으로 변경(아직 커밋되지 않음)
2. 트랜잭션 T2가 해당 계좌 잔액을 조회하면 90만 원으로 읽음
3. 트랜잭션 T1이 변경 상황을 롤백하여 잔액을 다시 100만 원으로 되돌림
4. 트랜잭션 T2는 잘못된 정보(90만 원)를 읽어온 것이 됨
트랜잭션 격리 수준에 따라 SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED로 나눌 수 있습니다.
1. SERIALIZABLE
가장 높은 수준의 격리로 트랜잭션을 순차적으로 진행시키는 것을 말합니다.
- 장점: Dirty Read, Non-Repeatable Read, Phantom Read를 모두 방지합니다.
- 단점: 교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준입니다.
2. REPEATABLE_READ
트랜잭션이 시작된 후 읽은 데이터는 다른 트랜잭션이 변경할 수 없습니다. 트랜잭션 중에 같은 데이터를 여러 번 읽어도 항상 같은 값을 얻습니다. 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않습니다.
- 장점: Dirty Read, Non-Repeatable Read는 방지합니다.
- 단점: 새로운 데이터 삽입/삭제로 인해 Phantom Read가 발생할 수 있습니다.
3. READ_COMMITTED
트랜잭션이 커밋된 데이터만 읽을 수 있습니다. 다른 트랜잭션이 커밋하지 않은 변경 사항은 보이지 않습니다.
가장 많이 사용되는 격리 수준이며 PostgreSQL, SQL Server, Oracle에서 기본값으로 설정되어 있습니다.
- 장점: 커밋되지 않은 데이터는 읽을 수 없으므로 Dirty Read는 방지합니다.
- 단점: 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다. 따라서 트랜잭션이 같은 행을 다시 읽을 때 다른 내용이 반환될 수 있습니다. 따라서, Non-Repeatable Read, Phantom Read가 발생할 수 있습니다.
4. READ_UNCOMMITTED
가장 낮은 격리 수준이며 다른 트랜잭션에서 커밋되지 않은 데이터도 읽을 수 있습니다.
- 장점: 가장 빠릅니다.
- 단점: 데이터의 신뢰성이 떨어집니다.
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read | 성능 |
SERIALIZABLE | 불가능 | 불가능 | 불가능 | 낮음 |
REPEATABLE_READ | 불가능 | 불가능 | 가능 | 중간 |
READ_COMMITTED | 불가능 | 가능 | 가능 | 중간 |
READ_UNCOMMITTED | 가능 | 가능 | 가능 | 높음 |
2-4. 지속성 Durability
트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 반영되어야 하는 것을 의미합니다. 시스템 장애가 발생하더라도 트랜잭션의 결과는 유지되어야 합니다. 지속성을 보장하기 위해 체크섬, 저널링, 롤백 등의 기능을 사용합니다.
체크섬(Checksum)
: 데이터의 무결성을 확인하기 위한 간단한 방법입니다. 데이터의 내용을 기반으로 생성된 작은 숫자 값(체크섬)을 사용하여 데이터가 손상되거나 변조되지 않았는지 확인합니다.
- 작동방식
1. 데이터가 저장될 때, 데이터의 내용을 기반으로 체크섬 값이 계산되어 함께 저장됩니다.
2. 데이터가 읽힐 때, 다시 체크섬을 계산하여 저장된 체크섬 값과 비교합니다. 두 값이 일치하면 데이터가 무결하다고 판단합니다. 일치하지 않으면 데이터가 손상되었음을 뜻합니다.
저널링(Journaling)
트랜잭션의 변경 사항을 데이터베이스에 반영하기 전에 별도의 저널(로그) 파일에 기록하는 기법으로 시스템 장애 시 데이터베이스를 복구할 수 있게 합니다.
3. 무결성 Integrity
무결성은 데이터의 정확성, 일관성, 유효성을 유지하는 것을 의미합니다. 데이터베이스는 현실 세계를 반영해야 하므로 데이터베이스 내 데이터는 현실 세계의 규칙과 제약 조건을 준수해야 합니다. 이러한 규칙과 제약 조건을 데이터베이스에 적용하는 것을 무결성 제약 조건이라고 합니다.
정확성: 데이터베이스에 저장된 데이터가 현실 세계와 일치해야 합니다. 데이터는 오류나 누락 없이 정확하게 입력되고 유지되어야 합니다.
ex) 상품의 가격 정보가 잘못 입력되면 안됨
일관성: 데이터베이스 내의 데이터는 모순 없이 일관되게 유지되어야 합니다. 같은 정보를 나타내는 데이터는 모든 테이블에서 동일한 값을 가져야 합니다.
유효성: 데이터베이스에 저장된 데이터는 정해진 규칙이나 제약 조건을 만족해야 합니다.
ex) 숫자 형식의 필드에는 숫자값만 입력되어야 하고 필수 입력 필드에는 NULL 값이 허용되지 않아야 함
무결성은 개체 무결성, 참조 무결성, 고유 무결성, NULL 무결성 등이 있습니다.
1. 개체 무결성 (Entity Integrity)
: 기본키로 선택된 필드는 빈 값을 허용하지 않습니다.
2. 참조 무결성 (Referential Integrity)
: 외래키(foreign key)는 참조하는 테이블의 기본키 값과 일치하거나 NULL값을 가져야 합니다. 참조되는 테이블의 데이터가 없을 수도 있기 때문에 NULL값을 가질 수 있습니다.
3. 고유 무결성 (Unique Integrity)
: 특정 컬럼 또는 컬럼 조합에 중복된 값이 없어야 합니다. 기본키는 고유 무결성을 만족해야 합니다. 예를 들어 주민등록번호, 운전면허증 번호, 이메일 주소 등은 테이블 내에서 고유해야 합니다.
4. NULL 무결성 (NULL Integrity)
: 특정 컬럼에 대해 NULL 값이 허용되지 않도록 보장하는 것을 의미합니다.
'DB' 카테고리의 다른 글
[데이터베이스] 조인의 원리 (0) | 2024.05.29 |
---|---|
[데이터베이스] 조인 JOIN (0) | 2024.05.28 |
[데이터베이스] 종류 (0) | 2024.05.21 |
[데이터베이스] ERD, 제1 정규형, 제2정규형, 제3 정규형, 보이스/코드 정규형 (0) | 2024.05.17 |
[데이터베이스] 데이터베이스 개념 (0) | 2024.05.15 |