* SQL SERVER는 조회 트렌젝션이 진행중인동안 다른 트렌젝션에 의해 변경된 정보가 반영되어 조회된다.
  즉, 읽기일관성이 보장이 되지 않는다.
  그러나 ORACLE은 조회 시작시점(consistent mode)의 데이터를 조회하므로 읽기일관성이 유지된다.

1. SQL SERVER
TX1                                                 TX2                                                 TX3
------------------------------------------------------------------------------------------------------------------------------------------------------------

-- 0. 
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. TX2가 2번 레코드까지만 읽게하기 위한 Transction
BEGIN TRAN
UPDATE TEST SET AMT = AMT + 100 WHERE NO = '2';

                                                    -- 2. 2번 레코드까지 읽고 Blocking된다.
                                                    SELECT SUM(AMT) FROM TEST;

                                                                                                        -- 3. 아직 읽지 않는 7번 레코드를 UPDATE한다.
                                                                                                        BEGIN TRAN
                                                                                                        UPDATE TEST SET AMT = AMT + 100 WHERE NO = '7';

-- 4. LOCK을 해제하여 TX2가 레코드 7번까지 읽게한다.
ROLLBACK TRAN;

                                                                                                        -- 5. TX2가 읽고지나간 3번 레코드를 UPDATE하고 COMMIT한다.
                                                                                                        UPDATE TEST SET AMT = AMT - 100 WHERE NO = '3';
                                                                                                        COMMIT TRAN;

                                                    -- 6. 변경된 7번 레코드 값만 반영되어 읽는다.
                                                    10100

                                                    -- 7. 다시조회하면
                                                    SELECT SUM(AMT) FROM TEST;
                                                    10000




2. ORACLE
TX1                                                 TX2                                                 TX3
------------------------------------------------------------------------------------------------------------------------------------------------------------

-- 0. 
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. TX2가 2번 레코드까지만 읽게하기 위한 Transction
UPDATE ACC_01 SET ACC_REMAIN = ACC_REMAIN + 100
WHERE ACC_NO = 7369;

                                                    -- 2. Blocking 안되고 읽는다. TX1의 영향없다.
                                                    SELECT SUM(ACC_REMAIN) FROM ACC_01;
                                                    13000

                                                                                                        -- 3.
                                                                                                        UPDATE ACC_01 SET ACC_REMAIN = ACC_REMAIN + 100 WHERE ACC_NO = 7844;

                                                    -- 4. Blocking 안되고 읽는다. TX1, TX3의 영향없다.
                                                    SELECT SUM(ACC_REMAIN) FROM ACC_01;
                                                    13000
-- 5.
ROLLBACK;

                                                    -- 6. Blocking 안되고 읽는다. TX1의 영향없다.
                                                    SELECT SUM(ACC_REMAIN) FROM ACC_01;
                                                    13000

                                                                                                        -- 7.
                                                                                                        UPDATE ACC_01 SET ACC_REMAIN = ACC_REMAIN - 100 WHERE ACC_NO = 7499;
                                                                                                        COMMIT;

                                                    -- 8. Blocking 안되고 읽는다. TX1의 영향없다.
                                                    SELECT SUM(ACC_REMAIN) FROM ACC_01;
                                                    13000