CA 36 – 격리 (ACID)
Source: Dev.to
시나리오
실험은 두 세션이 동시에 같은 계좌에 작업하려 할 때 ACID의 Isolation(격리) 속성이 어떻게 작동하는지를 보여줍니다.
단계
세션 1
BEGIN;
UPDATE accounts
-- (no COMMIT yet)
세션 2
SELECT * FROM accounts WHERE name = 'Alice';
결과: 잔액은 아직 커밋되지 않은 값(예: 200)이 아니라 1000을 그대로 보여줍니다.
UPDATE accounts
-- (this statement blocks, waiting for Session 1 to finish)
세션 1에서 커밋
COMMIT;
커밋이 완료되면 세션 2에서 대기 중이던 UPDATE가 진행되어 새로 커밋된 값을 사용합니다. 최종 잔액은 두 트랜잭션의 효과가 합쳐진 결과를 나타냅니다.
격리 수준 변경
READ COMMITTED (기본값)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
동작: 위와 동일—더티 리드가 없으며 세션 2는 커밋된 데이터만 볼 수 있습니다.
SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
동작: 두 트랜잭션이 충돌하면 하나가 오류와 함께 중단되고, 조용히 대기하는 대신 잠재적인 이상 현상을 방지합니다.
요약
격리는 동시에 실행되는 트랜잭션이 서로의 중간 상태에 영향을 주지 않도록 보장합니다. 여러 사용자가 동시에 같은 계좌를 수정하려 해도 데이터베이스는 일관성을 유지하고 데이터 손상을 방지합니다.