[세션 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]
--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 ('관우', '장각');
세션2 - 관우 학생의 변경을 시도 -> 무한대기상태
세션1 - 세션2에 의해 트랜잭션이 진행중인 장각의 변경을 시도했으므로 동시에 무한 대기 상태로 빠져듬
=> 이렇게 2개의 세션 모두 무한 대기상태에 빠져든 것을 DeadLock이라고 함
-DeadLock은 세션 사용자에 의해서는 해결불가.
-오라클은 무한 대기상태에 걸린 세션을 오류 처리하고,
강제로 마지막 명령만 ROLLBACK 함으로써 DeadLock을 처리한다.
'db : sql' 카테고리의 다른 글
Oracle/ 테이블 생성과 데이터 타입의 이해 (0) | 2020.02.28 |
---|---|
Oracle/ 트랜잭션의 이해 (0) | 2020.02.28 |
Oracle/ SELECT절 복습 adv (0) | 2020.02.28 |
Oracle/ SELECT절 복습 (0) | 2020.02.28 |
Oracle/ 서브쿼리를 이용한 DML문장 & 다이렉트 로드 (0) | 2020.02.28 |