실전 프로젝트 4일차. 프론트 코드 마무리를 하고 전체적으로 리팩토링을 실시했다. 그리고 앞으로 사용해야 할 인프라와 기술 스택에 대해 공부했다. 저녁엔 EC2를 jmeter로 테스트했는데 생각보다 잘 버텨서 놀라웠다. 오늘 TIL에는 트랜잭션의 개념에 대해 심도있게 정리해보려한다.
DB에서 하나의 논리적인 작업을 수행하기 위한 작업의 단위.
여러개의 쿼리문이 포함될 수 있다. 모든 쿼리가 성공적으로 수행되면 DB에 영구적인 변경을 반영하고(커밋) 쿼리가 하나라도 실패한다면 모든 변경작업을 취소한다(롤백).
따라서 트랜잭션은 데이터의 일관성과 무결성을 보장할 수 있다.
Atomicity: 원자성. 트랜잭션은 작업의 일부분이라도 실패하면 전체 작업이 취소된다. 모든 쿼리가 성공적으로 수행되어야 DB에 변경이 반영된다.
Consistency: 일관성. 트랜잭션 수행 전과 후에도 DB는 일관성을 유지해야 한다. 트랜잭션 전후에도 DB의 제약조건은 만족되어야 한다.
Isolation: 격리성. 트랜잭션은 다른 트랜잭션 작업에 영향받지않고 독립적으로 수행되어야한다. 여러 트랜잭션이 동시에 수행될 때 각각은 서로를 모르고 자신만 DB를 수정하는 것처럼 동작해야 한다.
Durability: 지속성. 트랜잭션이 성공적으로 수행된 후에는 영구적인 DB의 변경을 보장해야 한다. 시스템이 장애가 생겨도 영구적으로 저장된 데이터는 손실이 되지 않아야 한다.
Dirty Read : 어떤 트랜잭션이 아직 커밋하지 않은 데이터를 다른 트랜잭션이 읽어들이는 현상. 데이터의 일관성이 깨질 수 있어 이를 방지하기 위해 격리수준을 만든다.
READ UNCOMMITTED 격리 수준에서 발생 가능하다.
Non-Repeatable Read : 트랜잭션이 동일한 데이터를 두번 이상 실행할 때 결과값이 다른 문제. 트랜잭션동안 데이터가 변경될 경우 발생.
READ COMMITTED 격리 수준에서 발생 가능하다.
Phantom Read : 트랜잭션에서 동일한 쿼리를 실행했을 때 이전에는 없던 새로운 레코드가 결과에 포함되는 현상. Non-Repeatable Read는 하나의 데이터에 대한 문제이고, Phantom Read는 결과 집합에 대한 문제.
격리수준이 높을수록 DB의 일관성과 무결성을 보장. 하지만 동시성이 떨어지는 단점이 있다.