* SQL SERVER는 읽기, 쓰기 모두 Current mode.
ORACLE은 읽기는 Consistent mode, 쓰기는 Current mode이다.
1. SQL SERVER
TX1 TX2
------------------------------------------------------------------------------------------------
-- 1.
BEGIN TRAN
UPDATE TEST SET AMT = AMT + 100
WHERE NO = '2'
AND AMT = 1000
;
-- 2.
BEGIN TRAN
UPDATE TEST SET AMT = AMT + 200
WHERE NO = '2'
AND AMT = 1100 -> Blocking후 TX1후 Commit되면 반영된다. 항상 Current mode로 읽고 쓴다. 1300
AND AMT = 1000 -> Blocking후 TX1후 Commit되면 이 시점에 이미 TX1에 의해 값이 변경되어 UPDATE 실패다. 1100
;
-- 3.
COMMIT TRAN;
-- 4.
COMMIT TRAN;
2. ORACLE
TX1 TX2
------------------------------------------------------------------------------------------------
-- 1.
UPDATE ACC_01 SET ACC_REMAIN = ACC_REMAIN + 100
WHERE ACC_NO = 7369
AND ACC_REMAIN = 1000
;
-- 2.
UPDATE ACC_01 SET ACC_REMAIN = ACC_REMAIN + 200
WHERE ACC_NO = 7369
AND ACC_REMAIN = 1100 -> Blocking되지 않는다. Consistent mode로 읽기 때문에 읽기시에 조건에 맞는 레코드가 없다. 1100
AND ACC_REMAIN = 1000 -> Blocking후 TX1후 Commit되면 이 시점에 이미 TX1에 의해 값이 변경되어 UPDATE 실패다. 1100
;
-- 3.
COMMIT;
-- 4.
COMMIT;
* 위 예제를 변경해서
TX1에서 신규 Record를 INSERT하고, 그 해당 Record를 계속 UPDATE
TX2에서 기존에 있던 다른 Record를 UPDATE하는 경우에도 결과는 마찬가지로 같다.
즉, SQL SERVER는 TX2에서 여전히 Blocking이 걸리고, ORACLE은 Blocking없이 UPDATE처리 된다.