What is Transaction?
트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 간단하게 설명하자면, SQL 명령을 하나로 묶어서 실행하는 방법이라 볼 수 있겠다.
트랜잭션을 조작하는 기능은 사용자로 하여금 데이터베이스의 완전성 유지를 확신하게 한다. 트랜잭션을 시작해서 SQL 명령을 실행하면, 전체 명령이 성공하지 않는다면 데이터베이스 시스템은 ROLLBACK 명령을 통해 트랜잭션을 종료하여 SQL 명령을 적용하지 않고 파기한 후 종료한다는 뜻이다.
ACID
트랜잭션에는 ACID 라는 네 가지 특징이 있다.
Atomicity 원자성
원자성은 전부 성공 혹은 전부 실패를 의미한다. 영화 예매를 생각하면 편하다.
Consistency 일관성
일관성은 데이터 조작 전후에 일관성을 유지할 필요가 있다는 의미이다.
Isolation 격리성
격리성이란 동시에 데이터의 조작을 실행할 경우, 각각의 처리가 모순 없이 실행되는 것을 보증해준다는 의미이다. 아래로 갈수록 높은 수준의 격리 수준이다.
- Read Uncommitted : commit 되지 않은 읽기
아직 commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
음식점 김치 재사용... dirty read 를 발생시키는 대신 빠르다. - Read Committed : commit 된 읽기
commit 이 확정된 데이터만 다른 트랜잭션이 읽도록 허용한다. - Repeatable Read : 반복 읽기
Non-Repeatable read 를 방지한다.
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지한다.
Non-Repeatable read 를 예로 들자면, 은행에서 돈을 조회하고 잔액 5만원이 있음을 확인한 후 3만원만 뽑으려 할 때! 그 사이에 통신사에서 통신료 3만원을 뽑아가면 잔액부족으로 뽑을 수 없다 = 방금 조회했는데 찾으려니까 없는 황당한 상황을 방지한다. - Serializable : 직렬화 가능
Phantom read 를 방지한다.
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않는다.
지역별 고객을 조회하는 사이에 누가 고객 정보를 추가하면, 고객수가 1명 증가한다. 그 후 연령별 고객을 조회하면 지역별 고객과 값이 다른 현상이 발생한다 = phantom read
Serializable 수준이 가장 이상적인 격리 수준이나, 운영 시 동시성이 크게 떨어지면서 성능 상 이슈가 발생할 수 있다. 비용적이나 속도적인 측면의 효율성에 따라 serializable 수준의 격리를 유지할 필요까지는 없어서 그 아래 단계가 생기고, 그로 인해 dirty read, Non-repeatable read, phantom read 등의 문제가 발생하게 된 것이다.
아래의 표를 보면 어떤 격리 수준에서 어떤 문제가 발생하는지 쉽게 파악할 수 있다.
격리수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
Read Uncommitted | 발생 | 발생 | 발생 |
Read Committed | 방지 | 발생 | 발생 |
Repeatable Read | 방지 | 방지 | 발생 |
Serializable Read | 방지 | 방지 | 방지 |
Durability 지속성
지속성은 트랜잭션이 커밋되고 나면 데이터 변경 사항이 영구적으로 확정되도록 보장하는 것을 의미한다. 트랜잭션 조작을 하드 디스크에 로그로 기록하여, 이상이 발생한다면 발생 전 상태로 복구한다.
락과 데드락
락 lock
락은 데이터를 수정중이라는 사실을 알리는 방법의 잠금장치이다. 공유락 shared lock / read lock 과 베타락 exclusive lock / write lock 두 종류가 있다. 공유락은 데이터를 읽을 때 사용되는 락이다. 하나의 데이터를 동시에 여러 사용자가 읽게 해준다. 베타락은 데이터를 변경하고자 할 때 사용된다. 락이 해제되기 전까지 다른 트랜잭션은 해당 리소스에 접근할 수 없다.
데드락 deadlock
데드락은 두 개 이상의 트랜잭션이 각각 자신의 데이터에 대하여 락을 획득하고 상대방 데이터에 대하여 락을 요청하면 겪을 수 있는 무한 대기 상태를 의미한다. 교착상태라고도 한다. 데드락을 최소화 시키기 위해서는 오토 커밋(쿼리 단위로 커밋하는 것으로, 애플리케이션 잠금 실행 시 커밋의 부하가 너무 높다), 긴 트랜잭션(대량 처리를 한 개의 트랜잭션이 실행하는 것) 등을 자제하고 트랜잭션 관련 설정을 확인하여 격리 수준 등을 조정하거나 오류에 대처하는 형태로 애플리케이션을 작성하는 등의 처리를 해야 한다.
'SQL' 카테고리의 다른 글
데이터 모델링의 3요소와 식별자 (0) | 2021.05.13 |
---|---|
데이터 모델링 (0) | 2021.05.11 |
집합과 결합 (0) | 2021.04.27 |
db index & view (0) | 2021.04.27 |
데이터베이스 객체의 생성과 삭제 (0) | 2021.04.27 |