트랜잭션

jinkyung·2021년 1월 15일
0

DBMS

목록 보기
8/21
1. 트랜잭션의 이해
; 응용 프로그램 개발 과정에서 잘못 설계된 트랜잭션으로 인해
많은 문제가 발생한다. 
문제의 대부분은 업무분석의 미숙이나 트랜잭션이 일으키는 
잠금(Lock)에 대한 이해가 부족해서 나타나는 것이다.
트랜잭션과 Lock의 이해는 중고급 개발에 있어 매우 중요하다.

2. 트랜잭션이란?
트랜잭션은 반드시 함께 실행되는 작업의 단위를 의미한다.
즉 사용자의 의도에 따라 여러 개의 문장으로 구성된
트랜잭션은 반드시 동시에 실행(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 하기 위해서는 작업 이전 데이터를
 어딘가에 저장해 두어야 한다.
  오라클은 작업이 발생하면 즉시 테이블의 내용을 변경함으로써
 DELETEUPDATE 문을 실행하면 테이블의 정보가 즉시
 변경된다.
  그런데 사용자가 ROLLBACK 을 실행하면 DML 작업에 의해서
 변경된 정보를 이전 정보로 환원해야 하는데 만일 작업 이전 
 정보를 저장하고 있지 않다면 ROLLBACK 을 실행할 수 없게 된다.
 
  이렇게 작업 이전 정보를 저장하고 관리하는 것은 트랜잭션의
 기본 기능이며 이를 위해서 오라클은 Undo Tablespace 와
 Undo Segment 라는 물리적 구조를 이용한다.
 이들은 자동으로 관리되며 사용자는 이들 정보를 직접 볼 수
 없으며 단지 트랜잭션에서만 사용된다.
 
6.트랜잭션 과정
  예시로써 테이블의 데이터 57update 하는 과정을 묘사한다
  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)작업을 방지한다.
              (해당 행이 포함된 테이블에서)
              
              
 
내용을 입력하세요.

실습 세션1


--트랜잭션과 잠금의 이해
--1) 실습에는 2개의 일반 사용자 세션이 사용된다.
--2) 동일한 계정으로 접속한 SQL Developer를 2개 실행한다.
--3) 2개의 창은 [세션1]과 [세션2]로 구분한다.

--[세션1]

--1)
SELECT * FROM student WHERE sname='마초';
UPDATE student SET avr = 0.1
WHERE sname='마초';

--2) COMMIT 을 하지 않았으므로 마초의 행에는
--  독점 잠금이 발생하고, student 테이블에는
--  공유 잠금이 발생하였다.
--  student 테이블의 avr 값은 새로 변경되었고
--  Undo Segment 에는 마초의 이전 avr 값이 저장되었다. (1.68이 저장되어있음)
SELECT sno, sname, avr
FROM student
WHERE sname='마초';


--4) 트랜잭션을 완료하자
COMMIT;
내용을 입력하세요.
실습 세션2


--[세션 2]

--2) 다른 세션에서 변경하고 트랜잭션이 
--  완료되지 않은 행을 검색한다
--    Undo Segment 의 데이터를 읽어온다
SELECT sno, sname, major
FROM student
WHERE sname='마초';

--3) 독점 잠금이 걸린 행을 UPDATE 시도한다
UPDATE student SET major='경제'
WHERE sname='마초';


--6) 무한 대기가 풀리고 명령이 실행된 후
--   검색을 한다
SELECT sno, sname, major
FROM student
WHERE sname='마초';  


--7) 트랜잭션 완료
COMMIT;
내용을 입력하세요.

데드락 실습 세션 1


[세션 1]

--1) 관우, 장각 학생의 학과 정보를 검색한다
SELECT sno, sname, major
FROM student
WHERE sname IN ('관우', '장각');

--2) 관우 학생의 학과를 경제로 변경시도한다
--   트랜잭션 시작
UPDATE student SET major='경제'
WHERE sname='관우';

--3) 변경이 잘 되었는지
--     관우, 장각 학생의 학과 정보를 검색한다
--     아직 트랜잭션이 완료되지 않은 상태
SELECT sno, sname, major
FROM student
WHERE sname IN ('관우', '장각');

--8) 세션2가 장각의 트랜잭션을 진행중인 것을 모르고 
--   장각의 학과를 천문 학과로 변경을 시도
UPDATE student SET major='천문'
WHERE sname='장각';

세션2는 관우 학생의 변경을 시도했으므로 무한 대기상태였고
세션1은 세션2에 의해 트랜잭션이 진행중인 장각의 변경을
시도했으므로 동시에 무한 대기 상태로 빠져든다.
이렇게 2개의 세션모두 무한 대기상태에 빠져든 것을
DeadLock이라 부른다.

DeadLock은 세션 사용자에 의해 해결되지 않으므로
오라클은 먼저 무한 대기상태에 걸린 세션을 오류 처리하고
강제로 마지막 명령만 ROLLBACK 함으로써 DeadLock을 해결한다
  

COMMIT;
내용을 입력하세요.

데드락 실습 세션 2


--[세션 2]

--4)  세션1에서 변경을 시도한 행을 포함한
--    관우, 장각 학생의 학과 정보를 검색한다
SELECT sno, sname, major
FROM student
WHERE sname IN ('관우', '장각');


--5) 장각 학생의 학과를 경제로 변경시도한다
UPDATE student SET major='경제'
WHERE sname='장각';

--6)  잘 적용되었는지
--    관우, 장각 학생의 학과 정보를 검색한다
SELECT sno, sname, major
FROM student
WHERE sname IN ('관우', '장각');


--7) 관우 학생의 학과를 '물리'로 변경을 시도
--   현재 세션1에 의해 관우 학생의 행은 독점잠금이
--   걸려있는 상태이다.
UPDATE student SET major='물리'
WHERE sname='관우';

--상대와 DeadLock상태에서 오라클의 에러 발생 후
--강제로 마지막 명령만 취소되고 (관우-화학, 장각-경제로 나옴)
--ROLLBACK 에 의해 무한 대기가 풀리게 된다.
SELECT sno, sname, major
FROM student
WHERE sname IN ('관우', '장각');

COMMIT;

0개의 댓글