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을 건다.
CREATETABLE TEST (
id NUMBER, name VARCHAR2(10),sal NUMBER);
INSERTINTO TEST
VALUES(10,'aaa',1000);
INSERTINTO TEST
VALUES(20,'bbb',2000);
INSERTINTO TEST
VALUES(30,'ccc',3000);
SELECT*FROM test;
insa에 접속해서 test 테이블을 만들었다.
COMMIT를 하지 않으면 insa 접속자에 다른 이용자에게는 조회가 되지 않는다.
CREATETABLE TEST (
id NUMBER, name VARCHAR2(10),sal NUMBER);
INSERTINTO TEST
VALUES(10,'aaa',1000);
INSERTINTO TEST
VALUES(20,'bbb',2000);
INSERTINTO TEST
VALUES(30,'ccc',3000);
SELECT*FROM test;
COMMIT;
COMMIT를 실행하면 다른 사용자에게도 test 테이블이 조회가 된다.
UPDATE test
SET sal = sal*1.1WHERE 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문이 실행되지 못하는 것을 확인 할 수 있다.