[세션 2]
--1) 세션1이 COMMIT을 완료하지 않았으므로
-- Undo segment(즉, 갱신 이전 값)을
-- 보여준다.
SELECT sno, sname, avr
FROM student
WHERE sname = '마초';
2) 세션 1이 COMMIT 을 완료하였고
세션 2에서 마초의 평점을 확인한다
SELECT sno, sname, avr
FROM student
WHERE sname = '마초';
-- *트랜잭션에 의한 대기 현상 확인
-- 1) 마초의 학과를 검색한다.
세션 1은 학과를 '사회'로 변경하였지만
COMMIT 을 하지 않았기 때문에
세션 2는 이전의 정보인 '화학'으로
보여지게 된다.
SELECT sno, sname, major
FROM student
WHERE sname = '마초';
2) 세션 1이 독점 잠금을 걸어놓은 상태에서
세션 2가 학과를 '경제'로 변경을 시도한다
그러나 세션1이 독점 잠금을 걸어놓았기 때문에
명령이 완료되지 못하고 대기 상태에 진입한다
UPDATE student
SET major = '경제'
WHERE sname = '마초';
3) 세션1이 COMMIT 하였으므로 대기가 풀려
경제로 갱신이 가능하였다.
하지만 아직 COMMIT은 완료되지 않은 상태이므로
Undo segment 에서 데이터를 가져오게 된다.
그리고 세션2는 마초의 행에 독점 잠금을 걸어
놓은 상태이다
commit;
SELECT sno, sname, major
FROM student
WHERE sname = '마초';
* 데드락(Dead Lock)을 발생하고 RDBMS의 처리 과정을 확인한다
1) 장각의 학과를 경제학과로 갱신한다
장각의 레코드 행에 독점 잠금이 발생한다
UPDATE student
SET major = '경제'
WHERE sname = '장각';
2) 세션1이 이미 독점 잠금을 걸어놓은 상태인
줄을 모르고, 관우의 학과를 경제로 바꾸려고
시도한다
UPDATE student
SET major = '경제'
WHERE sname = '관우';
3) 장각은 [세션2]에서 독점 잠금을 걸고
있으므로 대기 상태가 되어야 하나 이렇게
되면 [세션1]과 [세션2]가 모두 대기 상태가
되어 데드락에 빠지게 된다.
이 때 현재 세션에 의해 잠겨있는 리소스를
요청한 [세션2] 트랜잭션을 ROLLBACK 시킨다.
ROLLBACK 은 트랜잭션의 모든 과정을 취소
시키는 것은 아니고 데드락을 발생시킨 문장만
ROLLBACK 한다.
commit;
'프로그래머 > SQL(Oracle)' 카테고리의 다른 글
SQL)Oracle_테이블 정의 스크립트 예 (0) | 2023.03.14 |
---|---|
SQL)Oracle_테이블생성과 데이터 타입의 이해 (0) | 2023.03.13 |
SQL)Oracle_TRANSACTION_SESSION1 (0) | 2023.03.13 |
SQL)Oracle_서브쿼리를 이용한 DML문장과 다이렉트 로드 (0) | 2023.03.13 |
SQL)Oracle_DML문장의 이해 (0) | 2023.03.13 |