Transaction
개념
우선, Transaction의 개념부터 알아보자. 단어의 뜻은 거래∙처리 이다. 데이터베이스에서의 거래∙처리인 것이다. 즉, Transaction이란 데이터베이스 내에서 수행되는 작업의 최소 단위이고, 데이터베이스의 무결성을 유지하며 DB의 상태를 변화시키는 작업을 수행한다.
작업의 최소 단위라는 것은 어떤 말일까? 은행의 송금 업무를 예로 들어보자.
나와 철수는 각각 100만원을 가지고 있고, 나는 은행 앱으로 철수에게 10만원을 송금하려고 한다. 그런데 은행 점검 시간이 잘못 겹치는 바람에, 나는 송금을 해서 잔액이 90만원이 됐지만, 철수는 입금 작업이 처리가 안돼서 여전히 100만원이다.
왜 이런 상황이 발생했을까? 내가 철수에게 10만원을 송금한다는 작업이 내 잔액에서 10만원 빠지기와 철수 잔액에 10만원 더하기 두 가지로 나누어 이루어졌기 때문이다. 즉, 송금은 내 계좌에서 빠지는 것과 상대방 계좌에 입금되는 것 두 가지를 포함해야 하는 것이며, 이것이 작업의 최소 단위이자 Transaction인 것이다.
특징
Transaction의 특징으로는 어떤 게 있을까?
Transaction은 하나 이상의 query를 포함해야 하고, ACID라 칭해지는 원자성∙일관성∙고립성∙지속성 4가지 규칙을 만족해야 한다. ACID는 다른 말로 Transaction이 안전하게 수행된다는 것을 보장하는 4가지 성질인 것이다. ACID에 대해서 알아보자.
- Atomicity (원자성) : Transaction은 전부 수행되던가, 전부 수행되지 않던가 해야 한다는 성질로, All or Nothing이라고도 표현할 수 있다. 다른 말로, 원자적으로 수행되어야 하며 ,Transaction 내에 있는 작업은 더 잘게 쪼개질 수 없다.
- Consistency (일관성) : Transaction이 수행되고 나면, 일관성을 유지해야한다는 성질로, 예를 들면 훨씬 이해가 쉽다. 아까 송금의 예를 들어보면, 내가 송금을 하기 전에도 100만원이라는 Int타입이고, 송금을 한 후에도 90만원이라는 Int타입으로, 타입이 일관되어 있다. 그리고, 송금하기 전에 나와 철수의 금액 합이 200만원 (100 + 100)이고, 송금 후에도 200만원 (90 + 110)으로 일관되어 있다.
- Isolatior (고립성) : Transaction이 여러 개가 병렬적으로, 동시에 수행되는 일이 많은데, 각각의 Transaction이 다른 것에 의해 방해받지 않는다는 성질이다. 그리고, 여러 Transaction이 하나의 데이터에 동시에 접근하는 일도 생기는데, 이때 고립성을 유지시켜주어야 하며, 충돌이 발생하지 않게 하기 위해 동시성 제어 (Concurrency Control)를 해줘야 한다.
- Durability (지속성) : 성공적으로 수행된 Transaction은 그 결과가 쭉 지속되어야 한다는 성질로, 데이터베이스 저장 후에 생기는 정전, 장애, 오류 등으로 데이터에 변동이 생기지 않아야 한다는 성질이다.
동시성 제어 (Concurrency Control)
동시성 제어에 대해 조금 더 알아보자. 우선 동시성 제어라는 건 어떤 상황에서 발생하는 것일까?
위에서 언급했듯, 여러 Transaction이 하나의 데이터에 동시에 접근하는 경우에서 어떤 Transaction의 데이터 업데이트가 적용이 안되는 갱신손실 문제가 발생할 때 동시성 제어를 해주어야 한다.
위 사진에서 보듯, transaction3의 작업이 Write 되기 전에 transaction2가 데이터를 들고가서 업데이트하고 Write해버린다. 이렇게 되면, 3의 작업은 적용되지 않기 때문에 갱신손실 문제가 발생한다. 이 상황에서 동시성 제어가 필요하다.
이를 해결하기 위한 방법 중 하나로, 하나의 Transaction이 데이터에 접근할 때 Lock을 걸어 다른 Transaction의 접근을 막는 방법이다.
transaction3이 데이터에 접근하여 Lock을 걸면 transacion2는 Write되고 Unlock될 때까지 기다렸다가 데이터에 접근할 수 있다.
Commit, Rollback
추가로, Commit과 Rollback이라는 개념이 있다. 데이터베이스는 Commit, Rollback 명령어를 통해 무결성을 보장한다.
Commit은 Transaction의 작업 내용을 완료하고 확정하는 명령어이며, 작업 내용을 실제 데이터베이스에 저장된다.
Rollback은 작업 상황에 문제가 발생했을 때 Commit 단위로 작업 내용을 되돌리는 명령어다.
Deadlock (교착상태)
Deadlock이란 자기가 잡고 있는 Lock은 안 풀면서, 서로의 Unlock을 무한정 대기하는 상황을 말한다. 즉, 두 transaction이 각각 lock을 설정하고, unlock을 하지 않은 상태에서 서로의 lock이 걸린 데이터에 접근 하려고 할 때, 서로 대기를 계속하여 영원히 처리되지 않는 상황을 말한다.
해결 방법으로는 예방 기법, 회피 기법, 탐지/회복 기법이 있다.
- 예방 기법 : ‘Deadlock이 발생하는 이유가 애초에 여러 Transaction이 하나의 데이터에 동시에 접근할 수 있기 때문’이라는 원인을 해결한 기법이다. 한 Transaction이 필요한 모든 데이터에 Lock을 걸어서 다른 Transaction이 접근하지 못하도록 막는 기법이다. 하지만, 만약 접근하는 데이터가 많다면, 사실상 모든 데이터베이스에 Locking한 것과 같으며 transaction의 병행성을 보장하지 못한다.
- 회피 기법 : 자원을 할당할 때 time stamp를 사용하여 deadlock이 발생하지 않도록 하는 기법이다.
- 탐지/회복 기법 : Transaction이 실행되기 전에는 아무런 검사를 하지 않고, Deadlock이 발생하면 이를 감지하고 회복시키는 방법이다.
'CS > 데이터베이스' 카테고리의 다른 글
[CS - 데이터베이스] Index에서 Column 사용 (또는 선정) 기준 (0) | 2023.02.13 |
---|---|
[CS - 데이터베이스] DB의 Index (0) | 2023.02.13 |
[CS - 데이터베이스] RDB와 NoSQL (2) | 2023.01.26 |
[CS - 데이터베이스] RDB의 테이블 결합 (left outer join, inner join) (0) | 2023.01.26 |
[CS - 데이터베이스] 관계형 데이터베이스의 관계 (1:1, 1:N, N:M) (0) | 2023.01.26 |