트랜잭션 격리 수준
Read Uncommitted
트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
Dirty Read, Non-Repeatable Read, Phantom Read가 일어날 수 있다.
Read Committed
트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용한다. 따라서 Dirty Read의 발생가능성을 막는다. 하지만 Non-Repeatable Read와 Phanton Read에 대해서는 발생 가능성이 있다.
Repeatable Read
트랜잭션내에서 삭제, 변경에 대해서 Undo 로그에 넣어두고 앞서 발생한 트랜잭션에 대해서는 실제 데이터가 아닌 Undo 로그에 있는 백업데이터를 읽게 한다. 이렇게하면 삭제와 수정에 대해서 트랜잭션내에서 불일치를 가져오던 Non-Reapeatable Read를 해소할 수 있다.
Serializable Read
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않도록 하는 설정.
Exclusive lock 과 Shared lock
Exclusive lock
쓰기잠금(Write lock)이라고도 한다.
어떤 트랜잭션에서 데이터를 변경하고자 할때, 해당 테이블 혹은 레코드(row)를 다른 트랜잭션에서 읽거나 쓰지 못하게 Exclusive lock을 걸고 트랜잭션을 진행 한다.
- exclusive lock 에 걸리면 shared lock을 걸 수 없다.
- exclusive lock에 걸린 테이블, 레코드등 자원에 다른 트랜잭션이 exclusive lock을 걸 수 없다.
Shared lock
읽기잠금(read lock)이라고도 한다.
어떤 트랜잭션에서 데이터를 읽고자 할 때 다른 shared lock은 허용 되지만, exclusive lock은 불가하다.
쉽게 말해 동시에 읽을 수는 있되, 변경은 불가하게 하는 것이다.
- 어떤 자원에 shared lock이 동시에 여러개 적용 될 수 있다.
- 어떤 자원에 shared lock이 걸려 있다면, exclusive lock은 걸 수 없다.
비관적 락과 낙관적 락
비관적 락(pessimistic lock)
트랜잭션이 시작될 때 shared lock 또는 exclusive lock을 걸고 시작하는 방법이다.
낙관적 락(optimistic lock)
데이터를 수정할 때 내가 먼저 이 값을 수정했다고 명시하여, 다른 사람이 동일한 조건으로 값을 수정할 수 없게 만드는 것이다.(version과 같은)
DB에서 제공해주는 특징이 아닌, application level 에서 잡아주는 락이다.
'인프라' 카테고리의 다른 글
Http 클라이언트 설정 시 메모 (0) | 2024.04.02 |
---|---|
Http keep alive 란 (0) | 2023.03.07 |
macos ventura 업데이트 후 ssh 오류 (0) | 2023.02.09 |
docker 기본 사용법 (0) | 2021.06.20 |
docker mysql 설치 (0) | 2021.06.20 |