트랜잭션
데이터베이스 상태를 변화시키는 일련의 작업 단위
1. 특성
- A 원자성: 모두 반영되거나 안돼야 한다
- C 일관성: 실행이 끝나면 일관성있는 상태여야 한다
- I 독립성: 트랜잭션은 다른 트랜잭션 연산에 끼어들 수 없다
- D 영속성: 실행이 끝나면 영구적으로 반영돼야 한다
2. 트랜잭션 명령어 (TCL)
- Commit
- 트랜잭션에 문제가 없고 올바른 결과라고 판단된 경우, 명령어를 통해 완료한다.
- Rollback
- 트랜잭션이 정상적으로 종료되지 않았을 때, last consistent state로 되돌린다.
- Savapoint
- 저장점을 정의하면 롤백할 때 SAVEPOINT의 상태로 되돌린다.
3. 트랜잭션 격리 수준 (isolation level)
동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것
즉, 한 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것
아래로 내려갈수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이다.
일반적인 온라인 서비스에서는 READ COMMITTED나 REPEATABLE READ 중 하나를 사용한다.
- READ UNCOMMITTED
- 변경내용이 COMMIT이나 ROLLBACK과 상관없이 다른 트랜잭션에서 조회 가능
- READ COMMITTED
- 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회 가능
- REPEATABLE READ
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회 가능
- MySQL에서 기본으로 사용
- SERIALIZABLE
- 읽기 작업에도 공유 잠금을 설정해서 동시에 다른 트랜잭션이 변경하지 못하게 함
- 동시처리 능력이 다른 격리수준보다 떨어지고, 성능저하가 발생
4. 격리 수준에 따른 문제
- Dirty Read
- 데이터가 변경되었지만, 아직 커밋되지 않은 상황에서 다른 트랜잭션이 해당 변경 사항을 조회할 수 있는 문제
- Non-Repeatable Read
- 같은 트랜잭션 내에서 같은 데이터를 여러번 조회했을 때 읽어온 데이터가 다른 경우
- Phantom Read
- 조회해온 결과의 행이 새로 생기거나 없어지는 현상
문제 | READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE |
---|
더티리드 | O | X | X | X |
반복불가능조회 | O | O | X | X |
팬텀리드 | O | O | O | X |
참조
https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/