목차
트랜잭션(Transaction)
트랜잭션은 데이터베이스에서 하나의 작업 단위를 말한다.
여러 개의 데이터 처리 작업들을 하나로 묶어서, 전부 성공하거나 실패하도록 만드는 것이다.
왜 트랜잭션이 필요할까?
데이터베이스는 정합성과 일관성을 지켜야 한다.
하지만 여러 작업을 하다가 중간에 실패하면 데이터가 꼬일 수 있다.
예를 들어:
은행계좌 이체 로직
- "A 계좌에서 10만 원 출금"
-"B 계좌에 10만원 입금"
이 둘은 항상 함께 이루어져야 한다. 하지만 출금은 됐는데 입금이 실패한다면?...
-> 돈이 사라진다
이는 정합성 붕괴를 말하며, 이를 방지하기 위해 트랜잭션이 필요하다.
트랜잭션의 특징
A- 원자성 (Atomicity) : 트랜잭션은 전부 실행되거나 전혀 실행되지 않아야 한다.
C- 일관성 (Consistency) : 트랜잭션 실행 전후로 데이터는 항상 일관된 상태를 유지해야 한다.
I - 격리성 (Isolation) : 동시에 실행되는 트랜잭션끼리 서로 영향을 주면 안 된다.
D- 지속성 (Durability) : 트랜잭션이 완료되면 그 결과는 영구적으로 저장돼야 한다.
트랜잭션은 데이터 정합성을 지키기 위한 최우의 안전 장치이다.
"이 작업들 중 하나라도 실패하면 아무것도 하지 마라"는 All-or-Nothing 전략으로, 시스템의 신뢰성과 안정성을 보장한다.
NULL
NULL은 데이터베이스에서 값이 존재하지 않음, 아직 모름, 정의되지 않음을 나타내는 특수한 상태를 말한다.
즉, NULL은 "0"도 아니고, 빈 문자열('')도 아니며 그냥 "값이 없다"는 상태 자체를 나타내는 것이다.
NULL의 개념 | |
존재 의미 | 값이 없다는 걸 의미함 |
0과 차이점 | 0은 숫자 값, NULL은 값 자체가 없음 |
''(빈문자열)과 차이점 | ''는 값이 있는 상태지만 비어있음, NULL은 아예 없음 |
연산 결과 | NULL과 어떤 값을 연산하여도 결과는 NULL |
비교 불가 | NULL = NULL은 true가 아니임 -> false 또는 unknown가 나옴 |
NULL을 주의해야하는 이유
NULL은 조건문에서 필터링이 안된다.
SELECT * FROM users WHERE name != '철수';
위와 같은 쿼리문은 이름이 '철수'가 아닌 사람을 찾지만, 이름이 NULL인 행은 결과에서 빠진다.
SELECT AVG(score) FROM students;
집계 함수 결과에 영항을 미친다. score 컬럼에 NULL이 있으면 평균 계산에서 자동으로 제외가 된다.
NULL을 다루는 법
IS NULL, IS NOT NULL | NULL은 일반 비교 연산자(=, !=)로 비교 불가 | WHERE email IS NULL |
COALESCE() | NULL을 다른 값으로 대체 | SELECT COALESCE(phone, '미입력') |
IFNULL()/ NVL() | DBMS에 따라 NULL 처리 함수가 다름 | Mysql: IFNULL(age, 0) |
NULLIF() | 두 값이 같으면 NULL 반환 | NULLIF(a,b) |
-- 이름이 없는 사람 찾기
SELECT * FROM users WHERE name IS NULL;
-- 나이 미입력자는 0으로 간주해서 계산
SELECT name, COALESCE(age, 0) as real_age FROM users;
-- NULL 평균 계산 예
SELECT AVG(score) FROM students; -- NULL 값은 제외하고 평균
'SQL > SQLD' 카테고리의 다른 글
#10 함수 (0) | 2025.04.10 |
---|---|
#9 SQL (0) | 2025.04.07 |
#7 반정규화(De-Normalization) (0) | 2025.04.06 |
#6 정규화(Normalization) (2) | 2024.12.06 |
#5 데이터 모델링(식별자) (0) | 2024.07.15 |