[SQLD] Chapter 2-2 트랜잭션(Transaction) ACID / NULL의 특성
데이터베이스에서 트랜잭션(Transaction)은 데이터의 일관성과 무결성을 유지하는 가장 중요한 개념 중 하나입니다. 트랜잭션은 데이터베이스 내에서 하나의 논리적인 작업 단위로 처리되며, 중간에 문제가 발생하면 전체를 취소(ROLLBACK)하고, 정상적으로 실행되었을 경우 최종적으로 반영(COMMIT)할 수 있도록 설계됩니다.
SQLD에 NULL 값을 처리하는 문제가 자주 출제 되기 때문에, NULL을 SQL문에서 어떻게 처리하는지 알아두는 것이 중요합니다.
1. 트랜잭션의 개념
트랜잭션이란 하나의 작업 단위를 의미하며, 데이터베이스 상태를 변화시키는 하나 이상의 SQL 연산(INSERT, UPDATE, DELETE)들의 집합입니다. 데이터베이스는 트랜잭션을 통해 데이터의 **무결성(Integrity)과 일관성(Consistency)**을 보장합니다.
1.1. 트랜잭션의 특징 (ACID)
트랜잭션이 안전하게 수행되기 위해서는 ACID(원자성, 일관성, 고립성, 지속성) 특성을 만족해야 합니다.
- 원자성(Atomicity)
- 트랜잭션은 All or Nothing 방식으로 실행됨
- 트랜잭션 내 모든 연산이 완료되거나, 하나라도 실패하면 전체가 취소됨
- 일관성(Consistency)
- 트랜잭션이 실행된 후에도 데이터베이스의 상태가 일관성을 유지해야 함
- 무결성 제약조건(Primary Key, Foreign Key, Unique 등)을 유지
- 고립성(Isolation)
- 동시에 실행되는 여러 트랜잭션이 서로 영향을 주지 않도록 독립적으로 실행되어야 함
- 지속성(Durability)
- 트랜잭션이 완료되면 해당 변경 사항이 영구적으로 반영되어야 함
- 장애가 발생하더라도 COMMIT된 데이터는 보존됨
1.2. 트랜잭션의 상태
트랜잭션의 진행 과정은 다음과 같은 상태를 가집니다.
- 활동(Active): 트랜잭션이 실행 중인 상태
- 부분 완료(Partially Committed): 마지막 명령문까지 실행되었지만 아직 COMMIT되지 않은 상태
- 실패(Failed): 오류로 인해 실행이 중단된 상태
- 철회(Aborted, Rolled Back): 오류 발생으로 인해 변경 사항이 취소된 상태
- 완료(Committed): 트랜잭션이 성공적으로 완료되어 변경 사항이 확정된 상태
1.3. 트랜잭션 격리 수준 (Isolation Level)
트랜잭션이 동시에 실행될 때 서로 간섭하는 현상을 방지하기 위해 격리 수준을 조정할 수 있습니다. 일반적으로 높은 격리 수준을 유지할수록 데이터 무결성은 증가하지만, 성능 저하가 발생할 수 있습니다.
트랜잭션 격리 수준 종류
- READ UNCOMMITTED
- 다른 트랜잭션이 아직 COMMIT하지 않은 데이터를 읽을 수 있음 (Dirty Read 발생 가능)
- READ COMMITTED (기본값, 대부분의 DBMS에서 기본 설정)
- 다른 트랜잭션이 COMMIT한 데이터만 읽을 수 있음 (Dirty Read 방지)
- REPEATABLE READ
- 같은 트랜잭션 내에서 같은 데이터를 여러 번 조회해도 동일한 결과를 보장 (Non-Repeatable Read 방지)
- SERIALIZABLE
- 모든 트랜잭션을 직렬화하여 실행 (가장 높은 격리 수준, 성능 저하 발생 가능)
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 10000 WHERE account_id = 'A001';
UPDATE accounts SET balance = balance + 10000 WHERE account_id = 'A002';
COMMIT;
2. NULL이란?
SQL에서 NULL(널) 값은 아직 정의되지 않은 값으로, 숫자 0 또는 공백('')과는 다릅니다.
- 0은 숫자 값이며, 공백('')은 하나의 문자로 간주됩니다.
- 테이블을 생성할 때 NOT NULL 또는 PRIMARY KEY로 정의되지 않은 모든 데이터 유형은 NULL 값을 포함할 수 있습니다.
2.1 NULL 값 처리 함수
1) NVL (Oracle 전용)
- NVL(컬럼명, 대체값) 형식으로 사용됩니다.
- NULL 값을 특정 값으로 변환할 때 활용됩니다.
- 예제:
→ 급여 값이 NULL이면 0으로 대체됩니다.SELECT NVL(급여, 0) FROM 직원;
2) ISNULL (SQL Server 전용)
- ISNULL(컬럼명, 대체값) 형식으로 사용됩니다.
- NULL 값을 지정된 값으로 변환할 때 사용됩니다.
- 예제:
→ 급여 값이 NULL이면 0으로 대체됩니다.SELECT ISNULL(급여, 0) FROM 직원;
3) COALESCE (모든 DBMS에서 사용 가능)
- COALESCE(값1, 값2, 값3, ...) 형태로 사용되며, NULL이 아닌 첫 번째 값을 반환합니다.
- 예제:
→ 급여 값이 NULL이면 0으로 대체됩니다.SELECT COALESCE(급여, 0) FROM 직원;
2.2 NULL 값과 연산
NULL 값과의 연산( +, -, *, / 등)은 결과가 NULL이 됩니다.
1) 행(Row) 연산
- NULL 값을 포함한 행 연산의 경우, 결과값은 항상 NULL입니다.
- 예제:
SELECT 100 + NULL FROM DUAL; -- 결과: NULL
2) 열(Column) 연산
- 열 단위의 집계 연산(SUM, AVG, COUNT 등)에서는 NULL을 무시하고 계산합니다.
- 예제:
SELECT SUM(급여) FROM 직원; -- NULL 값이 있어도 무시하고 합산
3) NULL 값과 비교 연산
NULL 값과의 비교 연산 (=, >, < 등)은 항상 FALSE를 반환합니다.
- NULL 값 비교 예제:
→ NULL 값은 직접 비교할 수 없으며, IS NULL을 사용해야 합니다.SELECT * FROM 직원 WHERE 급여 = NULL; -- 조회되지 않음
SELECT * FROM 직원 WHERE 급여 IS NULL; -- 올바른 조회 방법
4. NULLIF (모든 DBMS에서 사용 가능)
NULLIF(값1, 값2) 형태로 사용되며, 두 값이 같으면 NULL을 반환하고, 다르면 첫 번째 값을 반환합니다.
- 예제:
SELECT NULLIF(급여, 0) FROM 직원;
→ 급여 값이 0이면 NULL을 반환하고, 그렇지 않으면 급여 값을 반환합니다.
2.3 데이터베이스별 NULL 처리 차이
SQL을 사용할 때 데이터베이스 시스템마다 NULL을 처리하는 방식이 다를 수 있습니다.
Oracle | 빈 문자열('')을 NULL로 처리함 → WHERE 서비스명 = ''로 조회되지 않음 |
SQL Server | 빈 문자열을 그대로 저장함 → 일반적으로 WHERE 서비스명 = ''로 조회됨 |
Oracle (빈 문자열을 NULL로 처리)
CREATE TABLE test_table (service_name VARCHAR2(50));
INSERT INTO test_table (service_name) VALUES (NULL);
INSERT INTO test_table (service_name) VALUES ('');
COMMIT;
-- 빈 문자열을 NULL로 처리하므로 결과 없음
SELECT * FROM test_table WHERE service_name = '';
-- NULL을 올바르게 조회하는 방법
SELECT * FROM test_table WHERE service_name IS NULL;
SQL Server (빈 문자열을 그대로 저장)
CREATE TABLE test_table (service_name VARCHAR(50));
INSERT INTO test_table (service_name) VALUES (NULL);
INSERT INTO test_table (service_name) VALUES ('');
-- 빈 문자열과 NULL이 구분되므로 빈 문자열 검색 가능
SELECT * FROM test_table WHERE service_name = '';
-- NULL 값 검색
SELECT * FROM test_table WHERE service_name IS NULL;
- Oracle에서는 빈 문자열('')과 NULL이 동일하게 취급되므로 WHERE 컬럼명 = ''으로 조회하면 데이터가 검색되지 않을 수 있습니다.
- SQL Server에서는 빈 문자열이 NULL이 아니므로, 빈 문자열과 NULL을 구분하여 처리할 수 있습니다.
3. 마무리
이번 장에서는 트랜잭션의 개념과 트랜잭션을 제어하는 다양한 SQL 명령어에 대해 다루었습니다.
- 트랜잭션의 특징(ACID): 원자성, 일관성, 고립성, 지속성
- 트랜잭션 상태: 활동, 부분 완료, 실패, 철회, 완료
- 트랜잭션 제어 명령어(TCL): COMMIT, ROLLBACK, SAVEPOINT
- 트랜잭션 격리 수준: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- NULL은 정의되지 않은 값으로 0이나 ''(빈 문자열)과 다름.
- 행 연산과 열 연산에서 NULL값에 대한 처리가 다름.
- 데이터 베이스 마다 빈 문자열 ("") 에 대한 처리가 다름
다음 게시물 부터 Part2. SQL 기본 및 활용 진행하겠습니다!
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 3-1: SELECT 와 WHERE(feat. 연산자 & 함수 & 조건문) (0) | 2025.02.15 |
---|---|
[SQLD] Part 3: SQL 기본 (1) | 2025.02.14 |
[SQLD] 2-1: 정규화(Normalization)와 반정규화(Denormalization) (0) | 2025.02.13 |
[SQLD ] 1-3: 관계와 식별자 (feat. ERD 표기) (0) | 2025.02.13 |
[SQLD] 1-2: 엔티티(Entity), 속성(Attribute), 인스턴스(Instance) (0) | 2025.02.13 |