* 두개의 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 없음