hyeonga_code

Database_48_데이터 조작과 트랜잭션_DCL 제어어 본문

Oracle Database

Database_48_데이터 조작과 트랜잭션_DCL 제어어

hyeonga 2023. 8. 5. 05:59
반응형

-- 데이터베이스 작업 단위
    -- COMMIT이 될 때마다 TRANSACTION이 종료됩니다.
    -- SAVEPOINT : 트랜잭션 사이사이에 표시해두는 이정표입니다.
        -- ROLLBACK TO savepoint : 지정한 위치로 롤백합니다.
            -- 무조건 현재로부터 롤백을 진행합니다.
    
-- 데이터베이스 트랜잭션
    -- 트랜잭션을 기반으로 데이터 일관성을 보장합니다.
        -- 트랜잭션은 데이터를 변경할 때 뿐만 아니라 사용자 프로세스가 중단되거나 시스템 장애가 발생한 경우에도 데이터 일관성을 보장합니다.
    -- 데이터베이스 트랜잭션의 구성
        -- 데이터를 일관성 있게 변경하는 하나 이상의 DML문
        -- DDL
        -- DCL 
    -- 트랜잭션 시작 및 종료 시기
        -- 트랜잭션은 첫 DML 문이 실행됳 때 시작됩니다.
        -- 종료 시기
            -- COMMIT/ROLLBACK 문이 실행되는 경우
            -- DDL 문이 실행되는 경우
            -- DCL 문이 실행되는 경우
            -- SQL Developer등의 도구를 종료하는 경우
            -- 시스템에 장애가 있거나 시스템이 고장난 경우
                -- REDO 로그 파일로 보장됩니다.
        -- 트랜잭션이 종료되면 실행 가능한 SQL문이 실행될 때 다음 트랜잭션을 자동으로 시작됩니다.
    -- 트랜잭션 제어
        -- 암시적 트랜잭션 제어
            -- 자동 커밋
                -- DDL 문이 실행되는 경우
                -- DCL 문이 실행되는 경우
            -- 자동 롤백
                -- 사용자 도구의 비정상적인 종료
                -- 시스템에 장애시 발생
        -- 명시적 트랜잭션 제어
            -- COMMIT
            -- ROLLBACK
            -- SAVEPOINT



-- DCL_Data Control Language
    -- 장점
        -- 데이터 일관성을 보장합니다.
        -- 데이터 변경 내용을 영구적으로 저장하기 전에 미리 볼 수 있습니다.
        -- 논리적으로 관력된 작업을 묶어줍니다.
    -- COMMIT
        -- 실행 이전의 데이터 상태
            -- 데이터를 이전 상태로 복구할 수 있습니다.
            -- 현재 사용자는 SELECT 문을 사용하여 DML 작업 결과를 검토합니다.
            -- 사용중인 DML 문의 결과를 다른 사용자는 볼 수 없습니다.
            -- 관련 행이 잠기므로 다른 사용자는 관련 행의 데이터를 변경할 수 없습니다.]
        -- 실행 이후의 데이터 상태
            -- 데이터 변경 내용이 데이터베이스에 영구히 저장됩니다.
            -- 데이터의 이전 상태는 완전히 없어집니다.
            -- 모든 사용자가 결과를 볼 수 있습니다.
            -- 관련 행 잠금이 해제되어 다른 사용자가 행을 조작할 수 있습니다.
            -- 모든 저장점이 지워집니다.
    -- ROLLBACK
        -- 실행 이후의 데이터 상태
            -- ROLLBACK문을 사용하여 보류 중인 변경 내용을 모두 버립니다.
            -- 데이터 변경이 취소됩니다.
            -- 데이터가 이전 상태로 복구됩니다.
            -- 관련 행에 대한 잠금이 해제됩니다.
    -- 커밋되지 않은 데이터가 있는 경우 sqldeveloper 종료 시도 시, 커밋 여부를 묻는 메세지가 출력됩니다.
    -- 읽기 일관성
        -- 일기 일관성을 통해 항상 일관성 있는 데이터 뷰를 볼 수 있습니다.
        -- 한 사용자가 변경한 내용이 다른 사용자가 변경한 내용과 충돌하지 않습니다.
        -- 읽기 일관성은 동일한 데이터에 대해 다음을 보장합니다.
            -- 데이터를 읽는 중에는 쓸 수 없습니다.
            -- 데이터를 쓰는 중에는 읽을 수 없습니다.
    -- 잠금_LOCK
        -- 동시에 수행되는 트랜잭션 간의 파괴적인 상호 작용을 방지합니다.
        -- 사용자 작업이 필요하지 않습니다. >> DML의 시작에 자동으로 실행됩니다.
        -- 자동으로 최대한 낮은 레벨의 제한을 사용합니다.
        -- 트랜잭션 실행 기간동안 유지됩니다.
        -- 유형
            -- 명시적_Exlpicit
            -- 암시적_Implicit
                -- 두 가지 잠금 모드
                    -- 배타적_exclusive : 다른 사용자가 엑세스하지 못하도록 잠금을 실행합니다.
                    -- 공유_share : 다른 사용자의 엑세스를 허용합니다.
                        -- 테이블 삭제와 같은 테이블에 대한 LOCK은 여러 사용자가 중복으로 걸 수 있습니다.
                        -- 테이블 LOCK을 수행할 때 배타적, 공유 잠금 모드가 동시에 수행됩니다.
                -- 높은 레벨의 데이터 동시성
                    -- DML : 테이블은 공유 잠금, 행은 배타적 잠금
                    -- 질의 : 잠금이 필요 없습니다.
                    -- DDL : 객체 정의를 보호합니다.
                -- 잠금은 커밋 또는 롤백이 수행될 때까지 유효합니다.
                
    -- 테이블에 수동으로 LOCK을 실행합니다.
LOCK TABLE bigemp IN EXCLUSIVE MODE;
    /*
    Lock을(를) 성공했습니다.
        -- 레벨이 가장 높은 LOCK입니다.
    */
    
    -- 다른 창에서 데이터 수정을 시도합니다.
UPDATE bigemp
SET salary = salary*1.1
WHERE employee_id = 101;
        -- LOCK을 걸어두었기 때문에 진행되지 않습니다.
        
ROLLBACK;
    /*
    롤백 완료.
    */
    
    /*
    1 행 이(가) 업데이트되었습니다.
        -- ROLLBACK이 완료되자 마자 바로 업데이트 됩니다.
        -- 트랜잭션이 종료되어 다음 트랜잭션을 사용할 수 있습니다.
        
        -- DEAD LOCK
            -- 서로 종료되기 위해 커밋하기를 기다리는 상태를 의미합니다.
                1) A가 실행합니다.
                2) B가 실행합니다.
                3) A가 커밋을 하려고 하는 때에 B의 실행으로 LOCK이 걸려 대기상태가 됩니다.
                4) B가 커밋을 하려고 하는 때에 A의 실행으로 LOCK이 걸려 대기상태가 됩니다.
                5) A와 B가 서로 커밋으로 LOCK이 걸려 대기 시간이 지속됩니다.
                    -- 기본적으로 A의 실행문을 취소시킵니다.
                    -- B는 A의 LOCK이 해제되어 업데이트 됩니다.
                    -- A는 실행이 안 된 상태입니다.
                    
                -- A가 수동 LOCK을 걸어두고 수행하려 합니다.
                    -- B는 처음부터 접근할 수 없어 A의 수행이 완료될 때까지 기다려야합니다.
    */

반응형