본문 바로가기
SQL/개념

07. 트랜잭션 제어와 세션(TCL)

by Merware 2023. 5. 9.

01. TCL (Transaction Control Language)

TCL은 데이터베이스의 트랜잭션을 관리하는 데 사용되는 명령어들로, 트랜잭션의 작업을 저장하거나 취소할 수 있습니다. 주요 TCL 명령어에는 COMMIT, ROLLBACK, SAVEPOINT 등이 있습니다.

1. COMMIT (저장)

  • COMMIT은 트랜잭션의 모든 변경 사항을 데이터베이스에 영구적으로 저장하는 명령어입니다.
  • COMMIT을 실행한 후에는 해당 트랜잭션에서 수행된 변경 사항을 되돌릴 수 없습니다.
  • 모든 작업이 정상적으로 완료되었을 때 사용합니다.
-- 예시: 사원 테이블에 새로운 사원 정보 저장
INSERT INTO EMP (EMPNO, ENAME, JOB, SAL) VALUES (7934, 'MILLER', 'CLERK', 1300);
COMMIT;  -- 변경 사항을 영구 저장

2. ROLLBACK (실행 취소)

  • ROLLBACK은 트랜잭션의 변경 사항을 취소하고, 트랜잭션이 시작되기 전의 상태로 되돌리는 명령어입니다.
  • 데이터의 무결성 문제나 오류 발생 시 사용됩니다.
-- 예시: 사원 테이블에서 데이터 삭제 후 취소
DELETE FROM EMP WHERE ENAME = 'MILLER';
ROLLBACK;  -- 삭제된 내용을 취소하여 원래대로 복원

3. TRANSACTION (트랜잭션)

  • 트랜잭션은 데이터베이스 내에서 논리적으로 하나의 작업 단위로 처리되는 SQL 작업들의 집합입니다.
  • 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)을 보장해야 하며, 이를 흔히 ACID 특성이라고 합니다.

트랜잭션은 다음과 같은 흐름으로 이루어집니다:

-- 트랜잭션 흐름
BEGIN TRANSACTION;  -- 트랜잭션 시작

INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 1300);  -- INSERT 작업
UPDATE EMP SET SAL = 1500 WHERE EMPNO = 7934;  -- UPDATE 작업
DELETE FROM EMP WHERE EMPNO = 7934;  -- DELETE 작업

COMMIT;  -- 모든 작업을 확정하여 데이터베이스에 저장하거나
-- 또는 ROLLBACK;  -- 변경 사항을 취소하고 이전 상태로 복구

4. SESSION (세션)

  • 세션(Session)은 데이터베이스와 사용자 간의 연결을 의미합니다. 사용자가 데이터베이스에 접속하면 세션이 생성되며, 작업이 완료되거나 접속이 종료될 때 세션이 종료됩니다.
  • 세션은 유저명, 비밀번호, 호스트(IP), 포트 번호 등을 기반으로 연결됩니다.

세션 흐름:

  1. 사용자가 SQL*Plus 또는 SQL Developer 등을 통해 데이터베이스에 접속.
  2. 세션이 열리고, 사용자는 트랜잭션을 수행할 수 있음.
  3. 사용자가 로그아웃하거나 연결이 끊기면 세션이 종료됨.

5. LOCK (잠금)

  • Lock은 여러 사용자가 동시에 동일한 데이터에 접근할 때 데이터의 무결성을 유지하기 위해 사용됩니다.
  • 잠금은 주로 행 레벨(Row-Level) 또는 **테이블 레벨(Table-Level)**로 적용되며, 잠긴 상태에서는 다른 사용자가 동일한 데이터에 대한 변경 작업을 수행할 수 없습니다.
-- 예시: USER1이 사원 데이터를 수정하는 동안 잠금 발생
USER1:
UPDATE EMP SET DEPTNO = 10 WHERE EMPNO = 7934;  -- USER1이 작업 중인 EMPNO 7934는 잠금 상태
-- USER1이 COMMIT하기 전까지 다른 사용자는 해당 데이터를 수정할 수 없음
COMMIT;

-- USER2: USER1의 작업이 완료되기 전까지 잠금 대기 상태
USER2:
UPDATE EMP SET DEPTNO = 20 WHERE EMPNO = 7934;  -- USER1이 작업 완료 시점까지 대기
COMMIT;

행 레벨 잠금:

  • 특정 행(row)만 잠가서 해당 행에 대한 변경을 방지. 다른 사용자는 잠긴 행 외의 데이터를 수정할 수 있음.

테이블 레벨 잠금:

  • 테이블 전체에 대한 잠금. 해당 테이블에 대한 모든 변경 작업을 제한함.

트랜잭션 관리 시 주의 사항

  1. 트랜잭션이 끝나지 않은 상태에서의 세션 종료: 트랜잭션이 완료되지 않은 상태에서 세션이 종료되면 변경 사항이 자동으로 ROLLBACK됩니다.
  2. Lock 관리: 잠금이 걸린 데이터에 대해 다른 사용자는 변경 작업을 수행할 수 없으므로, 트랜잭션이 너무 오래 걸리면 성능 저하나 교착 상태(Deadlock)가 발생할 수 있습니다.

'SQL > 개념' 카테고리의 다른 글

09. 객체 종류  (0) 2023.05.09
08. 데이터 정의어(DDL)  (0) 2023.05.09
06. 데이터 조작어(DML)  (0) 2023.05.08
05. 서브쿼리  (0) 2023.05.03
04. 조인  (0) 2023.05.03