트랜잭션
트랜잭션
동시성 문제
Dirty Read
트랜잭션이 아직 커밋되지 않은 데이터를 읽을 때 발생하는 문제
트랜잭션 A가 트랜잭션 B에서 수정중이지만 커밋되지 않은 데이터를 읽을 수 있다. 트랜잭션 B에서 롤백 등의 이유로 커밋되지 않으면, 트랜잭션 A는 존재하지 않는 데이터를 사용하게 된다.
Non Repeatable Read
트랜잭션이 동일한 행을 두 번 읽었지만 매번 다른 데이터를 가져오는 문제
트랜잭션 1이 행을 읽는다고 가정하고, 트랜잭션 2는 해당 행을 업데이트하거나 삭제하고 업데이트 또는 삭제를 커밋한다. 트랜잭션 1이 행을 다시 읽으면 다른 행 값이 검색되거나 행이 삭제되는 경우가 발생한다.
Phantom Read
트랜잭션이 조건을 사용해 특정 범위의 레코드를 두번 읽었지만 매번 다른 데이터를 가져오는 문제
팬텀: 검색 기준과 일치하지만 처음에는 보이지 않는 행
트랜잭션 1이 일부 검색 기준을 만족하는 일련의 행을 읽는다고 가정한다. 트랜잭션 2는 트랜잭션 1의 검색 기준과 일치하는 새 행(업데이트 또는 삽입을 통해)을 생성한다. 트랜잭션 1이 행을 읽는 문을 다시 실행하면 다른 행 집합을 가져온다.
Transaction Isolation Level | Dirty reads | Nonrepeatable reads | Phantoms |
---|---|---|---|
Read uncommitted | O | O | O |
Read committed | X | O | O |
Repeatable read | X | X | O |
Serializable | X | X | X |
Isolation Level
READ UNCOMMITTED
가장 낮은 고립 수준
트랜잭션 내의 질의들이 공유 락을 걸지 않고 데이터를 읽음
따라서 오손 데이터를 읽을 수 있음
갱신하려는 데이터에 대해서는 독점 락을 걸고, 트랜잭션이 끝날 때까지 보유함
READ COMMITTED
트랜잭션 내의 질의들이 읽으려는 데이터에 대해서 공유 락을 걸고, 읽기가 끝나자 마자 락 해제
따라서 동일한 데이터를 다시 읽기 위해 공유 락을 다시 걸고 데이터를 읽으면, 이전에 읽은 값과 다른 값을 읽는 경우가 생길 수 있음
갱신하려는 데이터에 대해서는 락을 걸고, 트랜잭션이 끝날 때까지 보유
PL/SQL의 디폴트 고립 수준
REPEATABLE READ
질의에서 검색되는 데이터에 대해 공유 락을 걸고, 트랜잭션이 끝날 때까지 보유함
한 트랜잭션 내에서 동일한 질의를 두 번 이상 수행할 때, 이전에 읽은 값이 항상 동일하게 유지됨
갱신하려는 데이터에 대해서는 독점 락을 걸고, 트랜잭션이 끝날 때까지 보유함
SERIALIZABLE
가장 높은 고립 수준
질의에서 검색되는 튜플들 뿐만 아니라 인덱스에 대해서도 공유 락을 걸고 트랜잭션이 끝날 때까지 보유함
범위 질의의 경우 다시 조회할 때 추가되거나 제거된 레코드로 인해 팬텀 문제 발생 -> 인덱스에 대한 락으로 해결 가능, 범위를 포함한 상위 개념까지 락을 걸면 비용이 많이 들기 때문에 인덱스 락이 좋음, Next key value locking으로 해결
한 트랜잭션 내에서 동일한 질의를 두 번 이상 수행할 때 매번 같은 값을 포함한 결과를 검색하게 됨
갱신하려는 데이터에 대해서는 독점 락을 걸고 트랜잭션이 끝날 때 까지 보유함
Last updated