논리적인 일의 단위
데이터베이스에서 트랜잭션이란 SQL의 묶음
A logical unit of work: 논리적인 일의 단위
Atomic unit of processing(= All or Nothing): 처리에 쪼갤 수 없는 최소 단위 ---> 모든 SQL이 성공적으로 수행되던가 모든 SQL이 실행되지 않아야 함
A sequance og SQL statement: SQL 문장의 묶음
정리하자면, 논리적인 일의 단위로 SQL의 묶음으로 모든(All) SQL이 성공적으로 수행되던가 모든 SQL이 실행되지 않는(Nothing) 쪼갤 수 없는 하나의 원자적 단위(Atomic Unit)로 처리
트랜잭션의 4가지 특징
1. 일관성
2. 원자성
3. 고립성
4. 지속성
Transaction 시작
실행 가능한 첫번째 SQL 실행시 시작 ---> 오라클은 암시적으로 트랜잭션 시작
실행 가능한 SQL => 변경 가능한 SQL
1. DML(데이터 변경), DDL(object 변경), DCL(권한 변경) 실행시 트랜잭션 시작
DML, DDL, DCL 모두 데이터의 상태를 변경
2. SET TRANSACTION [READ ONLY | READ WRITE];
Auto(암시적) commit mode란? commit 명령을 사용하지 않아도 자동으로 commit이 수행되는 것
- DDL 수행시: 하나의 DDL이 하나의 트랜잭션 생성하여 암시적으로 commit 수행
- 정상적으로 접속 종료시: 어플리케이션에 따라 다름
- 비정상적으로 접속 종료시: 트랜잭션을 자동으로 ROLLBACK 처리
- DBMS 비정상 종료시: 다음 DBMS가 기동될 때 트랜잭션 ROLLBACK 처리
- 네트워크 연결이 끊길시: 트랜잭션 ROLLBACK 처리
Transcation 종료
명시적 종료: commit(영구히 저장), rollback(전으로 되돌림)
암시적 종료
1. DDL, DCL 실행시
- DML은 여러개의 명령어 묶음이 1개의 트랜잭션 구성
- DDL, DCL은 1개의 명령어가 1개의 트랜잭션 구성
2. 비정상 종료시 자동으로 트랜잭션 rollback 수행
- Client 프로그램의 비정상 종료
- connection이 끊김
- DBMS 서버의 비정상적인 종료
Transaction Control Language (제어 명령어)
- COMMIT: 트랜잭션 시작 이후 발생한 모든 변경사항을 데이터베이스에 영구히 저장하고 LOCK 해제
영구히 저장한다라는 의미?
CPU: 연산, 저장, 제어
Memory: 빠르게 입출력
Disk: 데이터를 영구히 저장
- Memory에 있지 않고 Disk에 내렸다는 의미
- 메모리에서 발생한 변경 사항이 디스크로 내려와 저장되는 것
- ROLLBACK(전체취소): 트랜잭션 시작 이전의 상태로 되돌림. 트랜잭션 진행중 발생한 모든 입력/수정/삭제 모든 변경사항 취소하고 LOCK 해제
ROLLBACK의 범위
트랜잭션 시작 이후부터 ROLLBACK(트랜잭션 종료)전 까지
- SAVEPOINT(부분취소): 현재 시점부터 savepoint까지 트랜잭션의 일부만 rollback 가능하도록 한 트랜잭션내 저장점
select문은 데이터를 변경하지 않기 때문에 트랜잭션과 관계가 없음
Transaction 고립성
트랜잭션 진행중에 변경된 데이터(변경이 진행중인 불안정한 상태인 데이터)인 중간 데이터는 '나' 즉 현재 세션에서는 조회가 가능하고 다른 세션에서는 변경이 진행중인 데이터를 조회할 수 없고 변경 이전 상태의 데이터 조회가 가능
Statement Level ROLLBACK
문장 범위의 ROLLBACK(Statment Level ROLLBACK) <-> Transcation Level ROLLBACK
Statment Level ROLLBACK : DML 명령어 실행시 에러가 발생하면 해당 명령어에 의해 변경된 데이터만 자동으로 ROLLBACK 되는 현상
한 문장에서 오류가 발생하면 Atomic unit of processing 때문에 해당 문장 이전의 문장들도 모두 ROLLBACK 처리
하지만 트랜잭션의 원자성이 보장이 되지 않는 경우가 있음
rollback; -- 이전 트랜잭션 종료
delete from emp where empno = 1111; -- 트랜잭션 시작
update emp set sal = 123456789 where empno = 7788; -- sal의 자리수보다 큰 값을 넣으려고 해서 오류 발생 (트랜잭션 진핸중, 에러 발생)
update emp set sal = 1234 where empno = 7902; -- 실행
commit; -- 트랜잭션 종료
select empno, sal from emp where empno in (1111, 7788, 7902); -- 오류가 발생한 문장 제외하고 트랜잭션 일부만 반영
위 SQL문 실행결과를 확인해보면 오류가 발생한 문장이 있기 때문에 트랜잭션 원자성(All or Nothing)이 적용되어 전부 취소가 되어야 하는데 일부만 성공처리 됨
=> SQL 문장만 가지곤 트랜잭션 제어 불가능
트랜잭션의 원자성(All or Nothing)을 보장하려면 어떻게 해야할까? 예외처리 기능 사용 필요
트랜잭션 범위 ROLLBACK(Transaction Level ROLLBACK)
데이터베이스 프로그램 개발시 트랜잭션을 처리 하기 위해서는 해당 프로그래밍 언어의 예외처리 기능 사용 필요
- PL/SQL: EXCEPTION 구문
PL/SQL: Block 구조화된 언어
BEGIN
EXCEPTION
END;
- JAVA: try ~ catch ` finally 구문
정리하자면, PL/SQL 예외처리 기능을 사용하여 트랜잭션의 원자성 보장. 프로그래밍 언어의 예외처리 기능을 사용해야 올바른 트랜잭션 제어
begin -- PL/SQL Block 시작
delete from emp where deptno = 20; -- 트랜잭션 시작
update emp set sal = 123456789 where empno = 7499; -- sal의 자리수보다 큰 값을 넣으려고 해서 오류 발생 (트래잭션 진핸중, 에러 발생)
update emp set sal = 1234 where empno = 7698; -- 실행 skip
commit; -- 실행 skip
exception -- 예외처리부
when others then
rollback; -- 트랜잭션 레벵 ROLLBACK
end; -- PL/SQL Block 종료
/ -- Blcok 실행(Send to DBMS)
select empno, sal from emp where deptno = 20 or empno in (7499, 7698); -- 오류가 발생했기 때문에 트랜잭션 전체 취소 되어 반영 안됨 -> 트랜잭션의 원자성
Transcation과 DDL
insert into emp(empno, ename, deptno) values(9999, 'OCPOK', 20); -- DDL은 암시적으로 성공하면 commit, 실패하면 rollback을 함
alter table emp add(sex char(1) default 'M'); -- DML은 암시적으로 성공하면 commit, 실패하면 rollback을 함
rollback; -- 위의 문장에서 암시적으로 commit을 해버렸기 때문에 rollback 안됨
desc emp;
alter table emp drop column sex; -- DML
rollback; -- 위의 문장에서 암시적으로 commit을 해버렸기 때문에 rollback 안됨
desc emp;
하나의 DDL 메서드, DML 메서드 하나의 트랜잭션을 생성 ---> 성공하면 암시적으로 commit, 실패하면 암시적으로 rollback 실행
트랜잭션과 읽기 일관성
트랜잭션 고립성(Isolation)에 의래 변경이 진행중인 불안정한 상태의 데이터를 볼 수 없고 항상 안정적인 상태의 데이터를 조회하는 특성
Isolation: 실행중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없는 성질
변경하기전에 변경 전 데이터를 임시로 저장해두어 읽기 일관성과 ROLLBACK 지원
트랜잭션과 Row Level Lock
DBMS에서는 동시 사용성과 데이터 공용성을 지원하기 위해 Lock 매커니즘 사용
- Row Level Lock: 내가 수정/변경하려는 레코드만 Lock을 검
- Table Level Lock: 모두 다 Lock을 검
Lock을 세션1에서 걸고 세션2에서 Lock을 다시 생성하고자 할 때 세션1의 Lock 해제할 때 까지 대기 해야됨
트랜잭션 유형
- OLTP: 실시간처리 ---> 작은양의 트랜잭션이 동시 다발적으로 발생 ex) 은행 계정계 업무(계좌 신규/이체/입금/출금/해지)
- OLAP = DSS(의사결정 분석 시스템) = Batch Processing: 일괄처리, 동시 자발적으로 처리 ---> 대량의 데이터를 요약 집계, 굵고 거대한 트랜잭션이 순차적으로 작은 빈도로 발생 ex) 은행 정보계 업무(신용평가/경영정보/통계)
- DTP: 분산 트랜잭션
'DB' 카테고리의 다른 글
무결성(Constraint) (0) | 2024.03.21 |
---|---|
Hash (0) | 2024.03.18 |
이상현상과 정규화 트랜젝션 개념 (0) | 2024.01.29 |
관계 데이터 모델 (1) | 2024.01.16 |
데이터베이스 개념 (0) | 2024.01.15 |