트랜잭션은 데이터베이스의 상태를 변화시키는 하나의 논리적 작업 단위입니다. 데이터의 무결성을 보장하기 위해 "전부 성공하거나, 전부 실패해야 한다(All or Nothing)"는 원칙을 가집니다.
[ 송금 요청 시작 ]
│
▼
[ START TRANSACTION ]
│
▼
[단계 1] 홍길동 계좌 5만원 차감 (DML)
│
▼
[단계 2] 이몽룡 계좌 5만원 가산 (DML)
│
▼
{ 두 작업 모두 정상 처리되었는가? }
│
┌────────────────┴────────────────┐
[ Yes ] [ No ]
│ │
▼ ▼
[ COMMIT ] [ ROLLBACK ]
(DB에 물리적 영구 반영) (단계 1을 포함하여 전면 취소)
│ │
▼ ▼
[종료: 홍길동-5만 / 이몽룡+5만] [종료: 두 계좌 모두 처음 상태로 복구]여러 트랜잭션이 동시에 실행될 때, 서로의 작업에 물리적으로 간섭하지 못하도록 독립성을 보장하는 성질입니다. 격리성이 높을수록 데이터는 안전하지만, 동시 처리 성능은 떨어지는 트레이드오프 관계를 가집니다.
안전성이 낮은 순서부터 높은 순서로 총 4가지 단계가 존재합니다.
• Dirty Read A 트랜잭션이 수정한 데이터를 커밋하기 전에 B 트랜잭션이 읽는 현상 (A가 롤백되면 B는 가짜 데이터를 본 셈이 됨). • Non-Repeatable Read 한 트랜잭션 내에서 같은 조회를 두 번 했는데, 중간에 다른 트랜잭션이 값을 수정/삭제하여 두 결과가 다르게 나오는 현상. • Phantom Read 한 트랜잭션 내에서 범위 조회를 두 번 했는데, 중간에 다른 트랜잭션이 새로운 데이터를 삽입(Insert)하여 두 번째 조회 때 유령(Phantom)처럼 새로운 행이 나타나는 현상.
UPDATE/INSERT)가 휘몰아치는 상황[결제 엔진] ──(미커밋 상태 데이터 발생)──> [DB 메모리]
│ (락 없이 즉시 읽기)
[경영진 대시보드] <────────────────────────────┘[유저 스크롤 시작] ──> 1페이지 조회 (A글 내용: "안녕하세요")
[타인 행동] ─────────> A글 내용 수정 및 커밋 ("반갑습니다")
[유저 스크롤 지속] ──> 2페이지 조회 시, 수정된 A글이 자연스럽게 반영되어 노출됨INSERT)가 유입되는 시스템에서 보안관제관이 최근 1시간 이력을 분석하는 상황[보안관제 분석] ──> 최근 1시간 로그 범위 조회 (기존 데이터 Lock으로 보호)
[로그 수집 엔진] ─> 새로운 로그 INSERT 진입 시도 (조건 범위 탐색 무시하고 즉시 삽입)격리 수준을 달성하기 위해 데이터베이스는 공유락(Shared Lock, S-Lock)과 배타락(Exclusive Lock, X-Lock)을 내부적으로 제어합니다.
잠금의 대상을 어느 규모로 잡느냐에 따라 자원의 격리 범위가 달라집니다.
WHERE id BETWEEN 10 AND 20)에 락을 걸거나, 데이터와 데이터 사이의 빈 공간(Gap)을 잠가서 새로운 데이터가 끼어들지 못하게 막는 정밀한 잠금 방식입니다.락의 범위(Granularity)는 시스템의 동시성 성능과 데이터 무결성 간의 시소게임입니다.
[락의 범위가 커질수록: Table ──> Partition ──> Range ──> Row]
- 데이터 무결성(안전성): 증가 ───> 데이터가 완전히 보호됨
- 동시 처리 성능(Concurrency): 감소 ───> 다른 트랜잭션들이 줄 서서 대기해야 함
[락의 범위가 작아질수록: Row ──> Range ──> Partition ──> Table]
- 동시 처리 성능(Concurrency): 증가 ───> 여러 사용자가 동시에 각자 다른 행을 수정 가능
- 관리 오버헤드: 증가 ───> 수많은 락 객체를 메모리에서 제어해야 하므로 DB 부하 증가 및 데드락(Deadlock) 위험 노출데이터베이스 명세에서 명령어의 목적에 따라 관리, 조작, 정의 언어로 구분합니다.
데이터베이스의 무결성, 보안, 권한 제어, 회복 등을 관리하기 위해 사용하는 내부 통제용 명령어입니다. 주로 DBA(데이터베이스 관리자)가 사용합니다.
GRANT SELECT, INSERT ON users TO hyeonjin_dev;REVOKE INSERT ON users FROM hyeonjin_dev;개발자가 가장 많이 사용하는 영역으로, 테이블 내의 실질적인 데이터(행)를 조회, 삽입, 수정, 삭제하기 위해 사용하는 명령어입니다. 트랜잭션의 제어를 받습니다.
SELECT * FROM users WHERE status = 'ACTIVE';INSERT INTO users (name, email) VALUES ('김현진', 'dev@example.com');UPDATE users SET status = 'BLACK' WHERE id = 45;DELETE FROM users WHERE id = 45;데이터베이스 객체(테이블, 인덱스, 뷰, 파티션 등)의 구조 자체를 생성, 변경, 삭제하는 명령어입니다. 실행 즉시 DB에 반영(Auto Commit)되는 특성을 가집니다.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);ALTER TABLE users ADD COLUMN update_date TIMESTAMP;DROP TABLE users;TRUNCATE TABLE users;COMMIT;ROLLBACK;SAVEPOINT sp_checkpoint;
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.