동시성 제어
동시성 제어
- 트랜잭션이 동시에 수행될 때, 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제어하는 DBMS의 기능
갱신 손실 문제
갱신 손실
- 두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생하며, DB에서 절대 발생하면 안되는 현상
- T1의 갱신이 손실된 갱신손실 문제가 발생락
- 데이터를 수정중이라는 사실을 알리는 방법의 잠금 장치
- 락
락의 유형
- 공유락 ( LS, shared lock) : 트랜잭션이 읽기를 할 때 사용하는 락
- 배타락( LX, exclusive lock) : 읽고 쓰기를 할 때 사용하는 락
공유락 배타락 규칙
- 데이터에 락이 걸려있지 않으면 트랜잭션은 데이터에 락을 걸 수 있다.
- X를 읽기만 할경우 LS(X)를 요청하고 읽거나 쓰기를 할 경우 LX(X)를 요청
- 다른 트랜잭션이 LS(X)걸어두면, LS(X) 요청은 허용하고 LX(X) 허용안함
- 다른 트랜잭션이 LX(X)를 걸어둔 경우, LS(X) , LX(X)모두 허용 안함
- 트랜잭션이 락을 허용받지 못하면 대기상태가 된다.
2단계 락킹
2단계 락킹 기법
- 락을 걸고 해제하는 시점에 제한을 두지 않으면 두개의 트랜잭션이 동시에 실행될 때 데이터의 일관성이 깨질 수 있어 이를 방지하는 방법
확장단계
- 트랜잭션이 필요한 락을 획득하는 단계
- 이미 획득한 락을 해제하지 않음
수축단계
- 트랜잭션이 락을 해제하는 단계
- 이단계에서 새로운 락을 획득하지 않음
데드락
- 두 개 이상의 트랜잭션이 각각 자신의 데이터에 대해 락을 획득하고 상대방 데이터에 락을 요청하면 무한 대기상태에 빠질 수 있는 현상, 교착상태 라고함
- 발생시 일반적으로 작업 하나를 강제로 중지시킴
트랜잭션 고립 수준
트랜잭션 동시 실행 문제
오손읽기
- 읽기 작업 하는 T1이 쓰기작업하는 T2가 작업한 중간 데이터를 읽기 때문에 생기는 문제
- T2가 ROLLBACK 할 경우 T1은 무효가 된 데이터를 읽고 잘못된 결과 도출
- 원자성이 없다.
반복불가능 읽기
- T1이 데이터를 읽고 T2가 데이터를 쓰고 T1이 다시 데이터를 읽을 때 생기는 문제
- T1이 읽기 다시한번 할 경우 이전의 결과와 다른 결과가 나오는 현상
- 일관성이 없다.
유령 데이터 읽기
- T1이 데이터를 읽고 T2가 데이터를 쓰고 T1이 다시한번 데이터를 읽을 때 생기는 문제
- T1이 읽기 작업을 한번 반복할 경우 이전에 없던 데이터(유령 데이터)가 나타난다.
- 반복 불가능 읽기랑 비슷하지만 없던 데이터가 삽입되었기 때문에 다르게 구분함
트랜잭션 고립 수준 명령어
- DBMS는 트랜잭션을 동시에 실행시키면서 락보다 좀 더 완화된 방법으로 문제를 해결하기 위해 제공하는 명령어 이다.
위에서부터 동시성이 높고 밑으로 갈 수록 동시성이 낮다.
READ_COMMITTED를 제일 많이 사용한다.
READ UNCOMMITED(LEVEL=0)
- 고립 수준이 가장 낮은 명령어로 , 자신의 데이터에 아무런 공유락을 걸지않는다.
- 배타락은 갱신손실때문에 건다
- 다른 트랜잭션에 공유락,배타락이 걸린 데이터를 대기하지않고 읽는다.
- SELECT 질의의 대상이 되는 테이블에 대해 NOLOCK 상태와 같다
READ COMMITTED(LEVEL=1)
- 오손 페이지의 참조를 피하기 위해 자신의 데이터를 읽는 동안 공유락을 걸지만 트랜잭션이 끝나기 전에라도 해지 가능함
REPEATABLE READ(LEVEL=2)
- 자신의 데이터에 설정된 공유락, 배타락을 트랜잭션이 종료할 때까지 유지하여 다른 트랜잭션이 자신의 데이터를 갱신할수없도록함
SERIALIZABLE(LEVEL=3)
- 고립 수준이 가장 높은 명령어로, 실행 중인 트랜잭션은 다른 트랜잭션으로 부터 완벽 분리
REPEATABLE READ가 TABLE의 행을 LOCK 거는 것이라면
SERIALIZABLE은 TABLE 전체에락을 건다
숭실대학교 Database 강의를 수강 후 정리하였습니다.
'Database' 카테고리의 다른 글
[Database] 스프링과 트랜잭션 (0) | 2023.08.06 |
---|---|
[Database] 정규화 과정 (0) | 2023.08.06 |
[Database] 회복 (0) | 2023.02.16 |
[Database] 정규화 (0) | 2023.02.13 |
[Database] 함수 종속성 (0) | 2023.02.12 |