-- 트랜잭션 1
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- 트랜잭션 2 (같은 세션에서 새로운 트랜잭션 시작)
BEGIN;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
트랜잭션의 격리성을 높이면, 데이터 무결성을 높이는데 좋지만, 동시성(성능)을 낮출 수 있음. 동시성 - 격리성은 트레이드 오프 관계로 격리성 수준을 적절히 선택해야함.
각 격리 수준과 관련하여 여러가지 이상 현상이 있음.
** 더티 리드(dirty reads)
: 커밋 되지 않은 데이터까지 읽는 현상으로, 롤백된 데이터를 읽을 수도 있음.
** 팬덤 리드(phantom reads)
: 하나의 트랜잭션 안에 동일한 쿼리가 두 개 이상일때, 각 쿼리의 결과값이 달라지는 현상
** 반복 가능하지 않은 리드(non-repeatable reads)
: 하나의 트랜잭션 안에 같은 레코드에 대한 조회가 두 번 이상 발생할때, 그 값이 달라지는 것. 팬텀 리드와 다른건, "행"을 기준으로 값이 달라지는지에 초점을 둠.
READ COMMITTED
: 커밋된 데이터만 읽을 수 있음. 성능과 일관성을 균형있게 보장.
→ 더티리드 방지. 팬텀 리드, 반복 가능하지 않은 리드는 발생 가능
→ RDBMS에서 가장 흔하게 사용되는 격리 수준(ex.PostgreSQL, Oracle의 기본값)
REPEATABLE READ
: READ COMMITTED에서 더 나아가, 트랜잭션 내에서 같은 행을 반복적으로 조회하더라도, 항상 같은 값을 읽도록 보장
→ 더티리드, 반복 가능하지 않은 리드 방지.
→ 새로운 행이 추가되는 것은 상관없으므로, 팬텀 리드는 발생 가능
→ MySQL 8.0 innoDB의 기본값
SERIALIZABLE
: 가장 높은 수준의 격리성으로, 이미 한 트랜잭션이 진행중일때, 다른 트랜잭션이 같은 데이터에 접근하는 것 자체가 방지됨.
→ 더티리드, 팬텀 리드, 반복 가능하지 않은 리드 모두 방지(트랜잭션이 순차적으로 이루어지므로)
→ 금융/회계 시스템 등 데이터 정합성이 매우 중요한 시스템에서 사용.
: 충돌 발생 가능성이 거의 없을 것이라 전제하고, 일단 트랜잭션을 진행한 후에
최종 결과를 보고 커밋할지 롤백 및 재시도 등을 할지 결정. 성능 좋음.
: 락을 취득한 트랜잭션이 진행되는 동안, 임계영역에 접근하려는 다른 트랜잭션을 접근을 막음.
: 읽기락. 공유 데이터에 대한 동시 읽기는 허용되지만, 쓰기 작업은 금지
: 공유 데이터에 대한 수정이 이루어지고 있기 때문에, 해당 테이블이나 데이터에 대해 읽기/수정 작업 모두 금지.
시스템 장애 발생시, 장애 발생 이전의 상태로 복구시키는 작업
대표적으로, 즉시 생신과 지연 갱신이 있음
즉시 갱신
트랜잭션이 실행될 때 마다 즉시 DB에 반영하고 이를 로그에도 기록해둠.
→ 장애 발생시, 로그 내용을 기반으로 장애 발생 전 커밋되지 않은 트랜잭션은 롤백시키고(Undo로그 사용), 커밋된 내용은 다시 적용시킴(Redo로그 사용 )
지연 갱신
트랜잭션 실행될 때마다 로그에는 기록해두지만, 실제 커밋되기 전까지는 DB에 반영하지 않음
→ 장애 발생시, 로그 내용을 기반으로 커밋된 내용까지만 다시 재적용(Redo)
DB 회복 과정에서, 로그를 다시 확인해야하는데 이때 체크포인트라는 개념이 나옴. 체크포인트는 물리적인 저장공간까지 반영 완료된 지점을 나타냄.
→ 체크포인트 이후의 내용에 대해서만 recovery 대상이 됨
지난 5주간 데이터베이스 스터디를 진행했다. 취준과 병행하다보니, 생각보다 갑자기 겹치는 일정들이 생겨서 과제만 제출한 주도 있었다(이 부분이 좀 아쉽다 ㅠㅠ) 하지만, 매주 과제를 수행하면서 데이터베이스에 대한 필수 이론들을 다시 정리하고 공부해볼 수 있었다. 프로젝트에서 데이터베이스를 많이 사용해봤음에도, 트랜잭션 격리, 회복, 이상 현상, 무결성과 정합성의 차이 등 명확하게 바로 설명하지 못했었다. 스터디를 통해, 데이터베이스에 대한 공부도 다시 해볼 수 있던게 좋았다. 면접은 사실 스터디를 통해, 실력이 엄청 늘었다기엔 너무 짧은 시간이었어서 ... 하지만 적어도 내가 어느 부분에 단점이 있는지는 발견할 수 있는 계기가 되었다.(한번 당황하면 페이스가 확 말린다던지 등) 특히, 멘토님들이 줌 회의실을 돌아다니시면서 면접도 같이 봐주실 때가 있는데, 던져주시는 질문들을 통해서 "내 프로젝트 경험이 이런 부분에서 질문을 받을 수 있겠구나"하는 경험들이 좋았다! 시간적 여유만 맞으면 다른 과목으로 한번 더 해보고 싶다