[DB] 트랜잭션, 동시성 제어, 락
- [ CS기초 ]/데이터베이스
- 2023. 2. 8.
트랜잭션
트랜잭션이란 데이터베이스에서 하나의 공통된 목적을 위한 작업을 의미한다. 예를 들면, A에서 B로의 '송금'이라는 거래를 위해서는 A의 잔고에서 임의의 금액을 빼고, B의 잔고에 임의의 금액만큼을 더해주는 2가지 일이 한 가지 일처럼 실행되어야 한다. 두가지 일 중에서 하나의 작업이라도 누락된다면 문제가 발생할 수 있는데, 트랜잭션은 모든 하위 작업을 묶어서 모두 실행되거나, 모두 실행되지 않도록 만든다. 만약에 모든 작업이 성공하여 DB에 변화가 반영되었다면 해당 작업이 커밋(commit)되었다고 하고, 하나라도 실패해서 작업 이전으로 되돌아가는 것을 롤백(rollback)이라고 한다.
트랜잭션의 성질
트랜잭션은 ACID로 불리는 4가지 대표적인 성질을 갖는데, 각각 원자성, 일관성, 고립성, 지속성의 특징을 갖는다.
1. 원자성(Atomicity): 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 말아야 한다는 뜻이다. 일부만 수행되는 일이 있어서는 안된다. DBMS는 회복 관리자 프로그램을 통해 이를 유지한다(All or Nothing)
2. 일관성(Consistency): 트랜잭션은 데이터베이스의 일관성을 유지해야 한다. 이 일관성은 테이블 생성 시에 create나 alter문의 무결성 제약조건을 통해서 명시된다.
3. 고립성(Isolation): 데이터베이스에서는 동시에 여러 트랜잭션이 수행될 수 있는데, 동시에 수행되는 트랜잭션들은 상호 존재를 모르고 독립적으로 수행되는 현상을 고립성이라고 한다. 고립성을 위해서는 DB에 동시에 여러 트랜잭션이 접근할 때 데이터의 일관성이 깨지지 않도록 동시성 제어가 필요하다.
4. 지속성(Durability): 트랜잭션이 정상적으로 완료 혹은 부분완료된 데이터는 DBMS가 책임지고 데이터베이스에 기록하는 성질을 말한다. 원자성과 유사하게 회복 관리자 프로그램을 통해서 지켜진다.
동시성 제어
트랜잭션이 동시에 수행될 때, 데이터의 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제한할 필요가 있다.
트랜잭션 T1과 T2가 존재한다고 하자. T1과 T2가 동시에 동일한 데이터를 읽을 경우에는 문제가 발생하지 않는다. 하지만 T1이 데이터를 쓰는 동안 T2가 해당 데이터를 읽는다면 오손 읽기, 반복불가능 읽기, 유령 데이터 읽기와 같은 문제가 발생할 수 있으며, T1과 T2가 동시에 동일한 데이터에 대한 쓰기 작업을 할 경우 갱신손실을 유발할 수 있다.
- 오손 읽기
-> T1이 쓰기 작업중인 데이터를 T2가 읽었는데, T1이 해당 작업을 rollback할 경우에 T2는 rollback되어 무효가 된 데이터를 읽게 되는 현상.
- 반복불가능 읽기
-> T2가 데이터를 2번 읽었는데, 그 사이에 T1의 쓰기(수정) 작업이 이루어지는 경우 T2는 쓰기 작업 없이 데이터가 변경되는 문제를 낳게 된다. 즉, T2입장에서는 동일한 select문으로 다른 결과가 도출될 수 있다.
- 유령 데이터 읽기
-> T2가 데이터를 2번 읽었는데, 그 사이에 T1의 데이터 삽입이 이루어지는 경우 T2는 이전에 없던 데이터가 나타나는 현상이 발생한다. 즉, T2 입장에서는 동일한 select문으로 새로운 데이터가 생성된다.
- 갱신 손실
-> T1과 T2가 한 개의 데이터를 동시에 갱신(update)할 때 발생하며, T1과 T2중에 먼저 커밋된 작업이 손실된다.
위와 같은 문제들은 트랜잭션 고립 수준을 조절함으로서 일부분을 해결 가능하다.
락
여러개의 세션에서 동시에 같은 데이터를 수정하게 되면 갱신 손실이 발생하는데, 트랜잭션 고립 수준에 따라서 허용할 수 있는 오손 읽기, 반복불가능 읽기, 유령데이터 읽기와는 다르게 갱신 손실은 절대 허용되어서는 안된다. 따라서 데이터베이스는 락(Lock)을 사용하여 데이터를 동시에 수정할 수 없게 해야 한다.
- 공유락(LS): 트랜잭션 읽기 작업시 사용하는 락
- 배타락(LX): 트랜잭션 읽기/쓰기 작업시 사용하는 락
데이터에 락이 걸려있지 않으면 트랜잭션은 데이터 X에 락을 걸 수 있는데, 읽기만 할 경우 LS(X)를 요청하고, 쓰기를 할 경우 LX(X)를 요청한다. 공유락(LS)는 다른 트랜잭션의 공유락은 허용하지만(배타락은 허용하지 않는다), 배타락(LX)가 걸려있는 경우 다른 트랜잭션은 공유락(LS)과 배타락(LX) 모두 허용하지 않고 대기한다.
트랜잭션이 종료될 경우 락을 반환하고, 대기하던 트랜잭션이 락을 획득하여 작업을 진행한다.
'[ CS기초 ] > 데이터베이스' 카테고리의 다른 글
[DB] SQL문 문법 정리 - DDL (0) | 2023.02.20 |
---|---|
[DB] 정규화 (0) | 2023.02.17 |
[DB] SQL문 문법 정리 - DML (0) | 2022.10.12 |
[DB] 관계 데이터 모델 기초 (0) | 2022.09.17 |
[DB] 데이터베이스 개념 (1) | 2022.09.10 |