Oracle SQL
[SQL] 데이터베이스 트랜잭션
YoonJuHan
2023. 5. 30. 20:47
트랜잭션의 개념
- 데이터 일관성을 보장하기 위해 오라클 서버는 트랜잭션이라는 단위를 기반으로 데이터 변경사항을 처리
- 데이터를 일관성 있게 변경하는 연관된 DML 문으로 구성
- 데이터 일관성 보장
- 데이터를 변경할 때
- 사용자 프로세스가 중단되거나 시스템 장애가 발생한 경우
트랜잭션의 시작과 종료
- 단일 트랜잭션
- 하나 이상의 DML 문
- 하나의 DDL 문이나 DCL 문
- 트랜잭션은 세션에서 첫 번째 DML 문이 실행될 때 시작
- 트랜잭션이 종료되는 이벤트
- COMMIT 또는 ROLLBACK 문이 실행되는 경우
- DDL 문이 실행되는 경우
- DCL 문이 실행되는 경우
- SQL*Plus나 SQL Developer를 종료하는 경우
- 시스템에 자앵가 있거나 시스템이 고장난 경우
트랜잭션의 종료
- 명시적 종료
- 사용자가 DML 실행 후에 COMMIT이나 ROLLBACK 명령문을 사용한 경우
- (참고) TCL : COMMIT, ROLLBACK 과 같은 트랜잭션을 제어하는 명령어
- 암시적 종료
- DDL 문 또는 DCL 문의 실행
데이터베이스 작업단위의 이해
TCL을 사용한 트랜잭션의 명시적 처리
- COMMIT
- 현재까지 보류 중인 모든 데이터 변경 내용을 데이터베이스에 영구 저장하고 현재 트랜잭션을 종료
- ROLLBACK
- 현재까지 보류 중인 모든 데이터 변경 내용을 취소하고 현재 트랜잭션을 종료
- 변경되었던 데이터는 모두 이전 값을 회복
- SAVEPOINT
- 현재 트랜잭션 내 특정시점에 이름을 주어 표시하는 명령문
- ROLLBACK 시 SAVEPOINT 이름을 지정하여 해당 SAVEPOINT 시점 이후의 변경 내용만 ROLLBACK 가능
- COMMIT 및 ROLLBACK 문을 수행하여 논리적으로 관련된 작업을 묶음으로써 데이터 일관성이 보장되고 데이터 변경 내용을 영구 저장하기 전에 미리 볼 수도 있다.
- 실습전 emp300테이블이 비어있으면 다음 명령문으로 다시 데이터를 채움
INSERT INTO emp300
SELECT emp_id, emp_name, salary, dept_id
FROM y_emp
WHERE dept_id =300;
COMMIT;
SELECT * FROM emp300;
- SQL Developer를 두 번 실행하여 각각 insa 사용자로 접속
- [세션1] 1097 사원의 급여 수정
- [세션1] 사원급여 조회(1097의 변경된 급여 확인)
- [세션2] 사원급여 조회(1097의 변경 전 급여 확인)
- [세션2] 1081 사원의 급여 수정
- [세션2] 1097 사원의 급여 수정 시도 → Waiting
- [세션1] ROLLBACK 실행
- [세션2] 5의 업데이트 성공 및 1097, 1081 사원의 변경된 급여 확인
- [세션1] 1081 사원의 변경 전 급여 확인
- [세션2] COMMIT 실행
- [세션1] 세션2에서 변경한 1097, 1081 사원의 급여가 확인됨
COMMIT 문
- 변경 후 COMMIT 문이 수행되기 전 데이터 상태
- 데이터는 이전 상태로 복구 될 수 있다. (ROLLBACK)
- 데이터를 변경한 세션은 변경된 데이터를 본다.
- 변경한 세션을 제외한 모든 사용자는 변경된 데이터를 볼 수 없다.
- 관련 행에 LOCK이 수행되어 동시에 다른 사용자가 수정할 수 없다.
- COMMIT 문이 수행된 이후의 데이터 상태
- 데이터는 이전 상태로 되돌릴 수 없다.
- 모든 사용자가 변경된 데이터를 볼 수 있다.
- 관련 행의 LOCK이 해제되어 다른 사용자가 행을 수정할 수 있다.
- 트랜잭션 실행하면서 중간에 SAVEPOINT를 여러 개 생성
SELECT * FROM emp300;
UPDATE emp300
SET salary = 600
WHERE emp_id = 1037;
SAVEPOINT s1;
UPDATE emp300
SET salary = 670
WHERE emp_id = 1081;
SAVEPOINT s2;
UPDATE emp300
SET salary = salary*1.2
WHERE emp_id IN (1087,1097);
SAVEPOINT s3;
DELETE FROM emp300
WHERE emp_id = 1019;
- emp300에 SAVEPOINT를 사용하여 트랜잭션을 부분 취소
SELECT * FROM emp300;
ROLLBACK TO s3;
SELECT * FROM emp300;
ROLLBACK TO s2;
SELECT * FROM emp300;
- ROLLBACK 명령은 모든 트랜잭션이 롤백하고 SAVEPOINT가 지워진다.
ROLLBACK;
SELECT * FROM emp300;
암시적 트랜잭션의 처리
- 명시적 COMMIT 또는 ROLLBACK 없이 자동으로 트랜잭션이 종료되는 경우를 의미
- 자동 COMMIT되는 경우
- 하나의 DDL 문이 실행되는 경우
- 하나의 DCL 문이 실행되는 경우
- CONNECT 명령어를 사용하여 세션을 변경하는 경우
- SQL*Plus를 정상적으로 종료하는 경우(EXIT 명령어 사용)
- 자동으로 ROLLBACK 되는 경우
- SQL*Plus 또는 SQL Developer가 비정상적으로 종료되는 경우
- 시스템에 장애가 발생한 경우
- 자동 COMMIT되는 경우
롤백의 원리
- UNDO Data
- DML의 실행으로 변경된 데이터의 이전 값
- UNDO Datafile
- UNDO Data를 트랜잭션 종료 전까지 임시로 보관하는 UNDO Data 전용 데이터 파일
- DML 처리 방식
- 데이터가 변경되면 테이블의 이전 데이터가 UNDO Datafile로 이동
- 테이블에는 변경된 데이터를 저장
- 롤백의 원리
- 명시적 또는 암시적으로 롤백 실행 시 UNDO Data가 다시 테이블의 변경된 데이터를 덮어씀
LOCK의 이해
- 데이터베이스 시스템에서 동일한 자원을 액세스하는 트랜잭션 간에 발생할 수 있는 파괴적인 상호 작용을 방지하
기 위한 하나의 방식- 오라클 LOCK은 자동으로 수행
- DML(데이터 조작어) 작업을 수행할 때, 오라클 서버는 DML LOCK을 통해 데이터 동시성을 제공
- 다른 사용자가 동시에 동일한 행을 다시 수정하지 못하도록 하며 아직 커밋하지 않은 변경 내용을 다른 사용자가 보지않게 한다
- LOCK은 COMMIT 또는 ROLLBACK 될 때까지 유효