* 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