1. 트랜잭션의 이해
; 응용 프로그램 개발 과정에서 잘못 설계된 트랜잭션으로 인해 많은 문제가 발생한다.
문제의 대부분은 업무분석의 미숙이나 트랜잭션이 일으키는 잠금(Lock)에 대한 이해가 부족해서 나타나는 것이다.
트랜잭션과 Lock의 이해는 중고급 개발에 있어 매우 중요하다.
2. 트랜잭션이란?
-- 왔다 갔다 일련의 과정이 완전히 끝나면 완료. 하나라도 끊기면 ROLLBACK으로 취소
트랜잭션은 반드시 함께 실행되는 작업의 단위를 의미한다.
즉 사용자의 의도에 따라 여러 개의 문장으로 구성된 트랜잭션은 반드시 동시에 실행(COMMIT)되거나 취소(ROLLBACK)된다.
RDBMS는 트랜잭션을 통해 작업의 단위를 결정함으로써 작업 결과의 신뢰성을 확보한다
3. 트랜잭션의 예시
금융 거래 중에 계좌 이체를 생각해보자.
A라는 사람이 자신의 소유 계좌에서 100만원을
B라는 사람의 계좌로 이체한다면 최소 2가지 작업이 수행된다.
첫번째 작업은 A의 계좌에서 100만원이 출금되는 것이고
두번째 작업은 B의 계좌에 100만원이 입금되는 것이다
그런데, A의 계좌에서 100만원이 출금은 성공했지만
B의 계좌에 100만원이 입금되기 전에 시스템이 다운된다면
B의 계좌에는 100만원이 입금되지 않고, A의 계좌에서만
100만원이 없어지게 된다.
이를 방지하기 위해 이 2개의 과정을 하나의 트랜잭션으로
묶어놓아 2개의 과정이 모두 처리되지 않으면 ROLLBACK 을
처리하여 거래가 취소되도록 함으로써 거래의 신뢰성을
확보하는 것이다
O O X
A -> B -> C -> D
A ~ D의 모든 절차를 묶어서 트랜잭션이라 부른다
A에서 B는 성공
B에서 C는 성공
C에서 D는 실패
이렇게 되면 ROLLBACK(취소)처리를 한다(트랜잭션 취소)
C에서 D가 성공이면 COMMIT(성공)처리를 한다(트랜잭션 완료)
4. 트랜잭션의 시작과 종료
1) 시작
이전 트랜잭션이 종료된 이후 DML(INSERT, UPDATE, DELETE) -- 테이블 내용 변경
문장이나 DDL(CREATE, ALTER, DROP, TRUNCATE), -- 테이블 구조 변경
DCL(GRANT, REVOKE)문장이 실행되었을 때 시작된다. -- 권한 변경
2) 종료
2-1)COMMIT 이나 ROLLBACK 명령이 실행될 때 종료된다.
2-2)DDL이나 DCL문장이 실행이 완료되면 자동으로 종료된다.
2-3)사용자의 정상 종료 시에 종료된다
2-4)데드락(DeadLock)이 걸리면 트랜잭션의 일부만 종료된다.
트랜잭션은 하나의 세션에서 단지 하나만 시작할 수 있다.
DML 인 경우 반드시 COMMIT 이나 ROLLBACK 으로 종료한다.
DDL 이나 DCL 은 오라클이 알아서 제어하니까 신경안써도 된다.
(세션이란? 오라클서버를 접속한 단위, 하나의 연결)
5. 트랜잭션과 언두 세그먼트(Undo segment)
DML 작업을 ROLLBACK 하기 위해서는 작업 이전 데이터를 어딘가에 저장해 두어야 한다.
오라클은 작업이 발생하면 즉시 테이블의 내용을 변경함으로써
DELETE 나 UPDATE 문을 실행하면 테이블의 정보가 즉시 변경된다.
--작업이전의 데이터 undo segment 에 저장함
그런데 사용자가 ROLLBACK 을 실행하면 DML 작업에 의해서 변경된 정보를 이전 정보로 환원해야 하는데
만일 작업 이전 정보를 저장하고 있지 않다면 ROLLBACK 을 실행할 수 없게 된다.
이렇게 작업 이전 정보를 저장하고 관리하는 것은 트랜잭션의 기본 기능이며
이를 위해서 오라클은 Undo Tablespace 와 Undo Segment 라는 물리적 구조를 이용한다.
이들은 자동으로 관리되며 사용자는 이들 정보를 직접 볼 수 없으며 단지 트랜잭션에서만 사용된다.
6.트랜잭션 과정
예시로써 테이블의 데이터 5를 7에 update 하는 과정을 묘사한다
DML 문장은 과정이 모두 동일하다.
1) UPDATE 명령이 내려지게 된다
2) 문장 수행을 위해 오라클은 Undo Segment 를 결정한다
3) 테이블에 저장되어있던 원래 값(5)이 Undo Segment 에
저장된다.
4) UPDATE 된 값(7)이 테이블에 저장된다.
5) 값이 변경된 행(레코드)는 독점 잠금(Lock)이 발생한다.
6) 테이블에는 공유 잠금(Lock)이 발생한다.
7) 트랜잭션이 COMMIT 되면 잠금은 해제되고
변경된 값(7)은 영구히 저장된다.
8) 트랜잭션이 ROLLBACK 되면 Undo Segment 에 저장했던
원래 값(5)을 테이블로 환원하고 잠금이 해제된다.
7. 독점 잠금(Exclusive Lock)과 공유 잠금(Share Lock)
1)독점 잠금 : 현재 세션이외에는 접근을 불허하는 잠금이다
트랜잭션으로 행에 잠금이 발생하면
다른 세션에서는 해당 행을 검색할 수 없고
단지 Undo Segment 의 정보만 보게 된다.
그리고 이때 테이블에는 공유 잠금이 발생하게 된다.
2) 공유 잠금 : 이것은 DML 작업으로 행이 잠겨있는 테이블에
대해서 DDL (DROP, ALTER)작업을 방지한다.
나머지는 실습..
'DB > Oracle SQL Developer' 카테고리의 다른 글
[erwin/sql] 12/9 모델링 / 시퀀스 (0) | 2020.12.09 |
---|---|
<47, 48> 테이블 생성, 데이터 타입 (0) | 2020.12.04 |
<39, 40> DML (0) | 2020.12.03 |
<37, 38> DML (0) | 2020.12.02 |
<35, 36> 다중 행, 열 (0) | 2020.12.02 |
댓글