IT/오라클

오라클 수업 7일째 (18.04.06) - 3 데이터 읽기 일관성과 락

Beautifulkim 2018. 4. 6. 15:58

-- 01. 데이터 읽기 일관성과 락 

/*

예를들어 오라클 샘이 커피의 앞면을 보고 있는데

학생들은 뒷면을 보는 상태(비동기)

*/

-- 비동시공유 : 먼저 작업 시작하고 끝나면 다음 사람 작업 들어가는 방식

-- 공유 : 동시접속은 가능하지만

-- 비동시공유(특정 클라이언트가 공유데이터를 특정시점(트랜잭션) 동안 독점)

-- 동기(Sync) : 데이터 상태의 일치 유지(테이블 락(Lock), 행 락(Lock))


/*

01. 데이터 읽기 일관성과 락 


① SELECT * FROM EMP01 WHERE ENAME='SCOTT';

② DELETE FROM EMP01 WHERE ENAME='SCOTT'; 

(

    오라클은 SCOTT 사원이 삭제되기 전에 

    자동으로 롤백 세그먼트에 이 행의 정보를 

    Before Image(복사 본)로 복사해둔다. 

    

    : 임시 DB에 저장(COMMIT을 안했기 때문에)

)

③ UPDATE EMP01 SET SAL=200 WHERE ENAME='SCOTT';

(

    영희에 의해 삭제된 행을 철수가 접근해서 

    그 내용을 변경한다는 것은 이치에 맞지 않기 때문에 

    락이 걸려 무한 대기 상태가 된다.

)

④ ROLLBACK;

(

    영희가 SCOTT 사원을 삭제하는 쿼리문에 대해 

    커밋이나 롤백을 해야만 철수가 SCOTT 사원의 정보를 변경할 수 있게 된다. 

    철수가 롤백을 수행하면 SCOTT 사원을 삭제하겠다는 명령문을 해제하게 되어 

    롤백 세그먼트에 저장된 복사 본이 원상 복귀된다.

)

⑤ 무한대기에서 벗어남 

(

    영희가 트랙잭션을 종료하였기에 무한 대기에서 벗어나게 되고 

    철수에 의해 SCOTT 사원의 급여가 200으로 변경된다.

)

*/


-- 작업 다른 말로 트랜젝션

DROP TABLE emp01;-- emp01 테이블 삭제


CREATE TABLE EMP01-- emp 테이블을 emp01이라는 사본 테이블로 복사

AS

SELECT * FROM EMP;


SELECT * FROM emp01;

UPDATE EMP01 

SET SAL=300 

WHERE ENAME='SCOTT';

COMMIT;



-- 1. uncommit read(수정,삭제중인 행 접근 O)

SELECT  sal

FROM emp01

WHERE ename='SCOTT';

-- 2. commit read(수정,삭제중인 행 접근 X 무한대기)

-- SELECT 또한 자기 잠금발생 

--따라서 SELECT문도 트랜잭션 종료 시키자

SELECT  sal

FROM emp01

WHERE ename='SCOTT'

FOR UPDATE;

commit;

-- 3. commit read(수정,삭제중인 행 접근 X 5초 동안 대기, sal 이 아닌 컬럼인 경우는 대기 X 읽기)

SELECT  sal

FROM emp01

WHERE ename='SCOTT'

-- FOR UPDATE OF 컬럼 WAIT 대기시간(초);

FOR UPDATE OF sal WAIT 5;


/*

★★★★★

개발자는 db를 사용하고 

항상 commit으로 종료를 해주어야 

다음 사용자가 사용할 수 있음.

*/