동시성을 다룰 때 크게는
- interleaved : 교대로 수행하면서 동시에 수행하는 것처럼 보이게 함
- parallel : 실제로 동시에 수행
두 개로 나뉜다.
데이터베이스에서 동시성을 다룰 때는 대부분 1번 방식을 사용한다.
트랜잭션
트랜잭션의 뜻은 데이터베이스에서 어떠한 일이 수행되는 논리적 최소 단위이다.
하나의 트랜잭션에는 데이터베이스 연산이 여러 개 들어갈 수 있다. ex) 삽입, 삭제, 수정
어떤 프로그램은 하나 이상의 트랜잭션이 포함되어 있다.
트랜잭션 연산
트랜잭션 연산에 앞서 디스크 속 블록을 읽고 쓰는 과정을 알면 이해가 쉽다.
https://growth-coder.tistory.com/12
read-item(x)
- x가 존재하는 디스크 블록을 찾는다.
- 디스크 블록을 메인메모리 버퍼 영역으로 읽는다. (디스크 블록이 이미 버퍼 영역에 있다면 안해도 된다.)
- 버퍼에서 x를 프로그램 데이터로 읽는다.
write-item(x)
- x가 존재하는 디스크 블록을 찾는다.
- 디스크 블록을 메인메모리 버퍼 영역으로 읽는다. (디스크 블록이 이미 버퍼 영역에 있다면 안해도 된다.)
- 버퍼에서 x를 프로그램 데이터로 읽어와서 수정한다.
- 데이터를 버퍼에서 디스크로 보낸다.
write-item(x)에서 데이터를 디스크로 보낼 때 두 가지 방법이 있다.
- 바로 보내기
- 모아두었다가 나중에 한 번에 보내기
x를 수정하고 다시 수정할 때 버퍼 영역에 디스크 블록이 존재한다면 시간이 단축되기 때문에 2번 방식을 주로 사용한다.
동시성(concurrency)이 중요한 이유
트랜잭션 연산에서는 다음과 같은 문제점들 때문에 동시성이 중요하다.
1. lost update
x가 10원을 받고 5원을 보냈다고 해보자.
최종적인 결과는 100+10-5 = 105가 되어야한다. 그런데 위의 순서대로 연산을 해보자.
먼저 T1에서 10원을 받아서 T1에서 x는 110이 되었다.
이를 작성하기 전에 T2에서 x를 읽어왔기 때문에 T2에서는 100을 읽어왔다.
그리고 5원을 보냈기 때문에 T2에서 x는 95가 되었다.
그리고 T1에서 110을 작성하고 T2에서 95를 작성하기 때문에 원하는 결과인 105가 아닌 95가 나왔다.
이를 lost update라고 한다.
2. temporary update problem
위 그림에서는 1번과 달리 T1에서 x를 수정하고 작성한 다음에 T2에서 x를 가져왔기 때문에 lost update 문제는 발생하지 않는다.
그런데 T1 연산의 마지막 부분에서 오류가 발생하여 실패하였다.
이럴 경우 T1 연산의 전체 과정을 취소해야 한다. 다시 말해서 실패 전에 T1에서 일어났던 read, write 연산은 잘못된 연산이라는 뜻이다.
그런데 T2는 이러한 잘못된 연산의 중간 결과값을 읽어왔기 때문에 문제가 된다.
이를 temporary update problem이라고 한다.
3. The incorrect summary problem
T2에서는 모든 값들의 합을 구하고 있고 이 과정 전후로 x에서 10원을 빼고 y에서 10원을 더했다.
전체 합의 값은 똑같아야 하는데 합을 구하는 연산이 중간에 껴있기 때문에 y에 10원을 더하기 전에 y를 합에 더한다.
그렇기 때문에 10원이 모자라는 것이다. 이를 incorrect summary problem이라고한다.
4. unrepeatable read
예매과정에 비유해보자면
어떤 표를 예매하고자 할 때 빈 자리를 확인하고 결제를 진행중이라고 해보자.
그렇게 결제를 하려할 때 다른 사람이 그 사이에 결제를 해서 자리를 뺏겼다면 이를 unrepeatable read라고 한다.
이러한 문제들을 예방하기 위해서 트랜잭션에서 동시성이 중요하다.
'공부 > Database' 카테고리의 다른 글
[Database] InfluxDB 개념 및 설치 (0) | 2023.08.29 |
---|---|
[Database] 자기 테이프와 CD-ROM의 특성 (0) | 2022.12.22 |
[Database] Index structures (multi-level oredered) B-tree와 B+ tree (0) | 2022.12.02 |
[Database] Index structures (single-level ordered) (0) | 2022.11.28 |
[Database] RAID technique (2) | 2022.11.27 |
댓글