* 두개의 Transaction이 동일한 범위를 UPDATE하고 SELECT할때 LOCK걸리는 차이
1. SQL SERVER
TX1 TX2
-----------------------------------------------------------------------------------
CREATE TABLE TEST
(NO VARCHAR(10) NOT NULL
,AMT INTEGER);
ALTER TABLE TEST ADD CONSTRAINT TEST_PK PRIMARY KEY(NO);
INSERT INTO TEST VALUES (1, 1000);
INSERT INTO TEST VALUES (2, 1000);
INSERT INTO TEST VALUES (3, 1000);
INSERT INTO TEST VALUES (4, 1000);
INSERT INTO TEST VALUES (5, 1000);
INSERT INTO TEST VALUES (6, 1000);
INSERT INTO TEST VALUES (7, 1000);
INSERT INTO TEST VALUES (8, 1000);
INSERT INTO TEST VALUES (9, 1000);
INSERT INTO TEST VALUES (10, 1000);
-- 1. Table level Lock 걸린다. (SP_LOCK)
begin tran
update test set amt = 1100
where no = '6';
-- 2. Blocking 된다. WHERE절로 특정 레코드만 조회해도 Blocking된다.
select sum(amt) from test;
-- 3.
tran commit;
-- 4. TX1의 Transaction처리가 종결되자 조회처리가 된다.
10100
* SQL SERVER는 특정 Record만 UPDATE해도 Table Level Lock이 걸린다.
따라서 다른 Transaction에서 해당 Table을 전체 조회 혹은 특정 Record만 조회해도 Blocking 된다.
단 UPDATE하는 구문의 값이 변경전과 변경후의 값이 같다면 즉, 변경이 없다면 Lock은 걸지만
다른 Transaction에서 해당 Table을 조회하는데 Blocking이 걸리지 않고 조회된다.
2. ORACLE
TX1 TX2
-----------------------------------------------------------------------------------
CREATE TABLE ACC_01
NOLOGGING
AS
SELECT EMPNO ACC_NO, ENAME ACC_NM, 1000 ACC_REMAIN FROM EMP;
SELECT * FROM ACC_01;
ACC_NO ACC_NM ACC_REMAIN
---------- ---------- ----------
1111 PARK 1000
7369 SMITH 1000
7499 ALLEN 1000
7521 WARD 1000
7566 JONES 1000
7654 MARTIN 1000
7698 BLAKE 1000
7782 CLARK 1000
7839 KING 1000
7844 TURNER 1000
7900 JAMES 1000
7902 FORD 1000
7934 MILLER 1000
13 rows selected.
-- 1.
update acc_01 set acc_remain = 1100
where acc_no = 7654;
-- 2. Blocking 안된다. (Consistent 모드, Undo Table에서 CR블록 생성하여 select)
select sum(acc_remain) from ACC_01;
13000 <- TX1의 Transaction처리결과는 상관없이 조회된다.
-- 3.
commit;
-- 4.
select sum(acc_remain) from ACC_01;
13100
-- ORACLE은 조회할때 해당 Table의 UNDO Data를 이용한 다중버전 읽기일관성을 제공하므로 Lock을 사용하지 않고, Blocking도 없다.
SQL SERVER ORACLE
TX1 INSERT UPDATE INSERT/UPDATE
TX2
--------------------------------------------------------------
SELECT Blocking Blocking Blocking 없음
UPDATE Blocking Blocking 같은 Record일 경우만 Blocking
INSERT Blocking Blocking 없음 Blocking 없음