SQL/SQLD

#8 트랜잭션과 NULL

sundori 2025. 4. 7. 16:54

목차

    트랜잭션(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