여러 트랜잭션을 동시에 실행하면 생기는 문제
- 트랜잭션이 동시에 여러개 실행된다면 여러 트랜잭션이 동시에 같은 데이터를 참조해 데이터의 일관성이 깨질 수 있다.
- 그러므로 트랜잭션이 하나씩 실행되는 것처럼 스케줄링할 필요가 있다.
- 여러 트랜잭션 스케줄링 방법이 있지만 보통 잠금을 사용한다.
- 잠금이란 자신이 데이터를 수정 중이라는 것을 알리는 방법이다.
Shared Lock, 줄여서 LS
- Shared Lock, 공유할 수 있는 락이다.
- 즉 LS가 걸려있을 때 다른 LS를 걸 수 있다.
- 바꿔말하면 LS끼리는 Block 되지 않는다.
- 읽기에 사용된다.
Exclusive Lock, 줄여서 LX
- Exclusive Lock, 공유할 수 없는 락이다.
- 무조건 하나만 걸 수 있다.
- LX는 LS, LX 어떠한 락이라도 허용하지 않는다.
- 쓰기에 사용된다.
2 Phase Locking, 줄여서 2PL
- 락이 있더라도 아무때나 걸고 해제하면 문제가 생긴다.
- 한번 건 락은 트랜잭션 끝까지 유지하고
- 트랜잭션 끝에서 한번에 풀어줘야한다.
- 이를 확장단계, 수축단계라고 한다.
트랜잭션 고립 수준
- READ UNCOMMITTED
- 가장 하위의 고립수준이다.
- 읽기 시 LS 걸지 않는다.
- 쓰기 시 LX를 건다.
- 읽기시 LS를 걸지 않으므로 쓰고 있는 중인 데이터를 읽을 수 있다.
- 다른 트랜잭션이 쓰는 중인 데이터를 읽을 수 있다.
- 그러므로 커밋되지 않은 데이터를 읽었다가 롤백되면 생기는 DIRTY READ,
- 트랜잭션 내에서 데이터 읽을 때마다 달라지는 UNREPEATABLE READ ( 직렬로 실행하면 이럴 일이 없다.)
- PHANTOM READ 문제 발생가 발생 가능하다
- READ COMMITTED
- 데이터를 읽는 동안 LS를 걸지만 바로 해제한다.
- 마찬가지로 쓰기 시에는 LX를 건다
- 수정중인 데이터를 읽는 DIRTY READ는 생기지 않는다.
- 데이터A 읽고(LS바로해제) - 타 트랜잭션 데이터A수정 - 데이터 A 다시 읽기 : UNREATABLE READ 발생
- 마찬가지로 집합적 락을 걸지 않으므로 PHANTOM READ 발생 가능하다.
- REPEATABLE READ
- 읽기 시 LS 걸고 트랜잭션 끝까지 유지한다.
- innodb의 기본 설정이다.
- 데이터A 읽고(LS바로해제) - 타 트랜잭션 데이터A수정(차단) - 데이터 A 다시 읽기 : UNREATABLE READ 발생하지 않는다.
- 마찬가지로 집합적 락을 걸지 않으므로 PHANTOM READ 발생 가능하다.
- SERIALIZABLE
- 인덱스에 공유락을 걸어 다른 트랜잭션아 INSERT를 할 수 없다.
- PHANTOM 문제가 사라지나, 성능상 이유로 잘 사용하지 않는다.
선점 잠금과 비선점 잠금 ( Pessimistic and Optimistic Lock )
- 선점 잠금이란 앞서 보았듯이 2PL을 이용하는 방법
- Locking이 확장하므로 원형으로 자신의 데이터를 Holding하고 타 트랜잭션에 요청하는 교착상태가 발생할 수 있다.
- 교착상태에서 벗어나기 위해 쿼리 Timeout이 필요하다.
- 비선점 잠금 혹은 낙관적 락은 데이터가 동시에 변경되지 않는다고 가정한다.
- 대신 버전을 기록해서 내가 읽었던 버전이랑 다르면 트랜잭션을 취소한다.
MVCC ( Multi Version Concurrency Control )
- 데이터를 버저닝하는 방법으로 동시성을 처리한다.
- 트랜잭션1이 A 를 A`으로 수정하면 A에 대해 새로운 버전이 생긴다.
- 트랜잭션2가 A 를 트랜잭션1의 수정 전에 읽고 수정 후에 다시 읽을려고 시도하면 DBMS가 이전 버전의 데이터를 보여준다.
- 추가적인 작업이 필요하다.
'데이터베이스' 카테고리의 다른 글
CAP 이론 소개 - 데이터베이스 초보자용 (2) | 2022.03.26 |
---|---|
Join 쿼리를 어떻게 최적화할까 (0) | 2021.03.10 |
로그인 아이디는 왜 pk로 적절하지 않을까? (0) | 2021.03.04 |
Narrative to ERD - Individual Assignment #3 (0) | 2020.12.23 |
Nested Query - Individual Assignment #2 (0) | 2020.12.23 |