오라클 트렌젝션, 데드락
작업단위 트렌젝션
데이터파일
모든 작업내용(데이터파일을 변경시킨내용)이 리두로그 파일에 시간단위로 적혀있다.
컨트롤파일 오라클이 데이터파일이나 리두로그파일을 사용할때 위치가 들어 있다. 미러링( 하드가 망가지더라도 복구하기 위해서)
서버프로세스는 데이터베이스 버퍼캐시를 통해 데이터파일의 데이터를 읽음 만약 버퍼캐시에 데이터가 없다면
데이터파일에서 데이터를 데이터베이스 버퍼캐시에 올려서 읽는다.
원하는 정보가 있는지 없는지 = 겟
원하는 정보를 찾으면 = 히트
원하는 정보를 못찾으면 = 리스
insert시 서버 프로세스는 버퍼캐시에서 해당테이블이 있는지 찾는다. 커밋시 데이터베이스 버퍼캐시에서 수행한다.
작업일지를 리두로그버퍼에게 저장하여 연속성을 유지한다. 커밋이 되었다면 리두로그버퍼는 리두로그파일에 작업일지를 저장한다.
데이터베이스 버퍼 캐시는 메모리가 블락형태로 되어있다.
블락의 크기를 다 채우기 전까지는 데이터파일에 내리지 않는다
이렇게 되면 데이터파일과 리두로그파일의 동기화가 달라서 데이터베이스가 불안정해지는데
일정시간마다 ckpt 체크포인트의 이벤트를 발생시켜 점검한다.
파라미터파일 데이터베이스 환경변수가 들어있다. 메모리사이즈
SMON 정전등으로 데이터베이스가 강제종료 되었을때 부팅하면서 컴트롤파일과 데이터파일, 리두로그파일을 점검해보고 복구를 자동으로 해준다
딕셔너리를 조회할때 데이터딕셔너리캐시로 올려서 조회한다.
sql문을 날리면 라이브러리캐시에 저장된다.
identified by st01
default tablespace users
quota unlimited on users;
grant connect, resource to st01;
grant create view to st01;
tnsping 계정이름 >> 데이터베이스 연결 확인방법
sql 명령어
트랜잭션(Transaction)과 잠금(Lock)의 이해
트랙잭션 : 커밋이나 롤백 하기 전까지의 작업단위
특성
원자성(Aotomicity)
- 트랜잭션은 최소의 작업 단위로서 전체가 처리되거나 취소될 수 있지만 일부만 처리될
수 없다.
일관성(Consistency)
- 트랜잭션이 실행된 이후 데이터베이스의 무결성은 반드시 유지돼야 한다.
독립성(Isolation)
- 트랜잭션을 여러 개 동시에 실행하더라도 각각의 트랜잭션은 서로 영향을 줄 수 없다.
즉 실행이 종료되지 않은 트랜잭션의 결과는 다른 트랜잭션에서 참조하는 것이 불가능하다.
영속성(Durability)
- 종료된 트랜잭션의 결과는 반드시 데이터베이스에 반영돼야 한다.
트랜잭션의 시작과 종료
1.시작
- 이전 트랜잭션이 종료된 이후 DML(INSERT, UPDATE, DELETE)문장이나 DDL(CREATE, ALTER,
DROP, TRUNCATE), DCL(GRANT, REVOKE)문장에 실행됐을 때 시작된다.
(보안등급에 따라 다르게 만들어져서 DML은 명령어 실행후에 커밋과 롤백 명령어를 실행을 완료되어야
종료되지만 DDL, DCL은 커밋과 롤백없이 명령어 실행이 완료되면 바로 종료된다.
DML은 작업을 계획하지 않고 하는 경우가 많고, DDL과 DML은 검증된 작업을 수행하는 경우가 많아서
커밋과 롤백을 묻지않고 실행된다.)
2.종료
- COMMIT이나 ROLLBACK 명령이 실행 될 때 종료된다.
- DDL이나 DCL문장의 실행이 완료되면 자동으로 종료된다.
- 사용자의 정상 종료 시에 종료된다.
- 데드락(Deadlock)이 걸리면 트랜잭션의 일부만 종료된다.
segment : 저장하는 곳을 뜻함
undo segment : 롤백을 수행할때 필요한 데이터를 저장하는 곳
독점 잠금 : 행을 잠금(현재 세션 이외에는 접근을 불허하는 잠금),
공유 잠금 : 테이블 잠금 (사용은 가능하지만 삭제는 불가능)
오라클의 데드락 해소 방식에대해서 기술하고 이렇게 해소하는 이유는 무엇인지 기술하시오.
세션1에서 먼저 한 테이블의 행의 데이터를 수정하면 해당 행을 독점 잠금 하고 해당 테이블을 공유 잠금한다.
세션2에서 해당 테이블의 다른 행의 데이터를 수정하여 독점잠금하지만 해당 테이블의 공유잠금은 되지 않는다.
세션2에서 세션2가 독점잠금한 행의 데이터를 수정하고
세션1에서 세션1이 독점잠금한 행의 데이터를 수정하려고 할때
세션2에서 2번째로 데이터를 수정할때 명령어 실행이 취소가 된다.
데드락을 해소하기 위해서는 세션1에서 commit,roolback 을 해주면 데드락이 해소가 되며 세션1의 명령은 다 수행이 되고
세션2의 명령은 2번째 명령을 제외한 1번째 명령만 적용이된다.
데드락이 생기는 이유는 세션1에서 행의 데이터 수정으로 행의 독점 잠금과 테이블의 공유 잠금이 되었고
세션2에서 같은 테이블의 행하나를 독점 잠금 하지만 세션1이 공유 잠금으로 먼저 실행의 우선권이 주어져서
세션2가 세션1보다 독점잠금한 행의 데이터를 먼저 수정하려고 해도 데드락 해소를 위해 세션2의 명령은 취소가 되기 때문이다.
이렇게 해소하는 이유는 먼저 해당 테이블의 행을 수정함으로써 독점 잠금과 공유 잠금을 설정한 세션에게 공유 잠금을 풀 수 있는
권한이 주어지기 때문이다.