ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [데이터베이스] Oracle DML Lock
    공부/데이터베이스 2022. 12. 20. 15:28

    ■ Oracle DML Lock

    • Lock은 테이블 단위로 Lock을 건다.
    명칭 설명
    RS
    (Row Share)
    Table에 Lock을 걸려는 Transaction이 Table안에 Lock 된
    Row가 있고 그 Row를 변경시키고자 하는 것을 가르킴
    RX
    (Row Exclusive)
    Lock이 걸린 Transaction이 그 Table에 있는 Row들에 대해
    하나 이상의 Update를 수행하고자 하는 것을 가르킨다.
    S
    (Share)
    Lock Transaction에 의해서 걸리는 Share Table Lock은 다른 Transaction들이 Table에 대한 Query를 이용한 특정 Row에 대한 Lock문들을 성공적으로 수행하기 위해서 허용
    SRX
    (Share Row Exclusive)
    한 시점에 주어진 Table에 대해 하나의 Share Row Exclusive Table Lock만이 걸릴 수 있다.
    Transaction에 의해 걸린 Share Row Exclusive Table Lock은
    다른 Transaction이 Query를 하거나 특정 Row를 Lock하는 것을 허용하나
    Table의 갱신은 허용하지 않는다.
    X
    (Exclusive)
    Lock을 건 Transaction이 Table에 대한 Access를
    Exclusive Write로 허용하는 Table Lock의 가장 제한적인 모드

    ■ Exclusive Lock & Share Lock

    명칭 설명
    Exclusive Lock & Share Lock
    작업 중인 에 대해 LOCK
    다른 세션에서 해당 행 검색 불가
    UNDO SEGMENT의 정보만 보게된다.
    행이 포함된 테이블에 대해서 SHARE LOCK도 발생한다.
    오라클은 행마다 EXCLUSIVE LOCK을 건다.
    CREATE TABLE TEST (
    id NUMBER, name VARCHAR2(10),sal NUMBER);
    
    INSERT INTO TEST
    VALUES(10,'aaa',1000);
    
    INSERT INTO TEST
    VALUES(20,'bbb',2000);
    
    INSERT INTO TEST
    VALUES(30,'ccc',3000);
    
    SELECT * FROM test;
    • insa에 접속해서 test 테이블을 만들었다.

    • COMMIT를 하지 않으면 insa 접속자에 다른 이용자에게는 조회가 되지 않는다.

    CREATE TABLE TEST (
    id NUMBER, name VARCHAR2(10),sal NUMBER);
    
    INSERT INTO TEST
    VALUES(10,'aaa',1000);
    
    INSERT INTO TEST
    VALUES(20,'bbb',2000);
    
    INSERT INTO TEST
    VALUES(30,'ccc',3000);
    
    SELECT * FROM test;
    
    COMMIT;
    • COMMIT를 실행하면 다른 사용자에게도 test 테이블이 조회가 된다.

    UPDATE test
    SET sal = sal*1.1
    WHERE id = 20;
    
    SELECT * FROM test;
    • UPDATE를 실행하고 다른 사용자에게서 조회를 하면 바뀐 값이 표시가 되지 않는다.

    • COMMIT를 실행하면 다른 사용자에게도 바뀐 값이 표시가 된다.

    • 이번에는 insa의 2번째 사용자(화면에서 오른쪽)에서 업데이트를 실행하고 1번째 사용자(화면에서 왼쪽)에서 조회해보겠다.

    • 역시나 마찬가지로 COMMIT을 실행하지않으면 1번째 사용자에게도 바뀐 값이 조회되지 않는 것을 알 수 있다.

    COMMIT를 실행하자 1번째 사용자도 바뀐 값이 조회가 된다.

    • 이번에는 RX LOCK을 걸어보겠다.
    LOCK TABLE test
    IN EXCLUSIVE MODE;

    LOCK을 걸자 2번째 사용자로부터 UPDATE문이 실행되지 못하는 것을 확인 할 수 있다.

    • 이번에는 sys로 접속하여 insa에 test테이블을 조회해보자

    LOCK이 걸려있어 조회가 불가능하다. 그렇다면 다른 방법은 없을까?

    • GRANT로 특정 사용자에게 권한을 줄 수 있다.
    GRANT SELECT, UPDATE
    ON test
    TO sys;

    sys 접속자에서도 정상적으로 조회가 된다.
    정상적으로 UPDATE문도 실행 가능하다.


     

Designed by Tistory.