베하! 안녕하세요.
9월이 왔고 확실히 8월 보다는 날씨가 시원해지고 있어 기분이 좋습니다. 때론 춥기도 하네요.
오늘 알아볼 내용은 트랜잭션입니다.
트랜잭션은 모든 it 서비스에서 가장 중요한 역할을 담당하고 있어 반드시 알고 있어야 하는 내용 중 하나입니다.
트랜잭션(Transaction)
트랜잭션이란 여러 개의 작업을 하나로 묶은 실행 유닛이라고 말합니다. 이는 데이터 베이스의 상태(데이터)를 변화시키기 위해 수행하는 **작업의 모음을 하나의 단위를 뜻하게 됩니다.**
결국 트랜잭션은 데이터베이스에서 원자적인(atomic) 작업의 모음이겠죠.
‘원자’는 쪼갤 수 없는 가장 작은 단위를 말하는데 이 원자들(작업 혹은 쿼리)의 모음이 되는 것을 생각해보면 이해가 쉬울 수 있습니다.
데이터 베이스는 DML(데이터 조작어), DDL(데이터 정의어), DCL(데이터 제어어), TCL(트랜잭션 제어어) 들로 값을 조회하고 그 값을 기반으로 데이터를 삽입하고 테이블을 만들고 상황에 따라 commit하여 반영하고, rollback하여 원복 시키게 됩니다.
이러한 작업을 하나로 묶어서 commit 시키거나 특정 상황에서 rollback을 하게되는데 이 대상이 되는 작업의 묶음이 트랜잭션이라고 할 수 있겠습니다. **즉, 쿼리를 모아 놓은 하나의 작업 단위가 될 수 있겠지요.
트랜잭션은 원자성
- 트랜잭션은 내부에 포함된 작업들이 모두 정상적으로 작동되고 원하는 작업이 완료되어야 종료해야 합니다
- 트랜잭션에 속해있는 여러 작업 중 하나의 작업이 실패하게 되면 트랜잭션 내부의 다른 작업의 성공유무와 상관없이 해당 트랜잭션은 실패하게 되어야 합니다.
- 트랜잭션은 내부의 개별 작업의 성공, 실패 라는 것을 기준으로 실제 트랜잭션의 성공유무를 정의해서 작업이 미완료되지 않게 해야 성공한다고 볼 수 있습니다.
ACID
트랜잭션은 반드시 이 ACID라는 성질을 보장해서 안정성을 확보해야 합니다. ACID로 트랜잭션의 안정성을 보장해야하고 그것이 곧 트랜잭션의 목적이 됩니다.
수 많은 데이터를 배치작업 한다고 가정하면 데이터를 다루는 트랜잭션 내부의 각 작업이 안정성을 통해 의도치 않은 데이터의 유실 혹은 변경을 막아야 의도한대로 배치작업이 완료되겠지요. 그러기 위해서 ACID를 반드시 알아야 합니다.
Atomicity(원자성)
- 사실 트랜잭션에 중요한 부분을 뽑아라 하면 원자성이 아닐까 생각합니다.
- 한 트랜잭션의 작업이 모두 성공하거나 전부 실패해야 하는 성질을 말합니다.
- A계좌에서 B계좌로 송금할 때 A계좌에 잔액을 조회해야 하고 송금하는 작업을 함께 묶어 수행해야 하는데 A가 송금에 성공했지만 B계좌로 송금 내역을 저장(insert)할 때 실패하면 송금 만큼의 금액은 세상 속에서 사라지게 되는 문제가 발생합니다.
- 따라서 이 문제를 예방하기위해 해당 트랜잭션은 하나라도 실패하면 모든 작업을 실패로 돌려서 rollback작업을 수행하게 해야합니다.
- 원자성을 더 구체적으로 설명하면, 트랜잭션 내의 모든 작업이 완전히 실행되거나 전혀 실행되지 않아야 합니다.
Consistency(일관성)
- 하나의 트랜잭션이 일어난 이후에는 DB의 제약이나 규칙들이 기존과 같이 만족해야 합니다.
- 예를 들어 잔액에 음수의 값을 표시하면 안되기 떄문에 송금 트랜잭션의 이후에 음수의 값을 표시하는 결과가 되게 된다면 일관성에 문제가 되게 됩니다.
- 그래서 트랜잭션의 작업 이전 혹은 이후라도 DB의 제약이나 규칙들이 유지 될 수 있도록 트랜잭션을 구성해야 합니다.
- 계좌 이체 트랜잭션에서 잔액이 음수가 되는 것을 방지해야 합니다.
Isolation(격리성, 고립성)
- 여러 트랜잭션이 있을 때 각 트랜잭션을 다른 트랜잭션으로 부터 독립적,고립적을 만족해야 합니다.
- 여러 트랜잭션이 있을 때 같은 데이터에 접근해야 하는 경우가 있는데 이때 다른 트랜잭션이 데이터를 변경시킨 것을 모르고 다른 트랜잭션은 그 데이터를 기반으로 데이터를 계산하기 때문에 문제가 발생할 수 있습니다.
- 그래서 트랜잭션이 동시에 데이터 접근을 방지하도록 lock을 걸거나 다른 로직을 통해 순차적 접근 등 제한이 필요합니다.
- 동시성 제어를 통해 구현됩니다. Locking 또는 다른 격리 수준(Read Committed, Serializable 등)을 사용하여 여러 트랜잭션이 서로 간섭하지 않도록 보장합니다.
Durability(지속성)
- 트랜잭션이 성공적으로 완료가 된다면 그 결과는 영구적으로 반영되어야 한다는 점 입니다.
- 이것은 데이터베이스 시스템이 장애가 발생하더라도 트랜잭션 결과가 손실되지 않음을 보장합니다.
- 이를 위해 데이터베이스는 트랜잭션 로그를 사용하여 변경 내용을 디스크에 기록하고, 장애 복구 시에 이 로그를 활용하여 데이터를 복원합니다.
ACID 중요성
ACID 속성은 데이터베이스 트랜잭션의 안정성을 보장하고 데이터 일관성을 유지하기 위해 매우 중요합니다. 특히 금융 및 중요한 업무 프로세스와 관련된 시스템에서는 ACID 속성을 준수해야 합니다. 데이터베이스 시스템은 이러한 속성을 제공하여 데이터 손실과 무결성 위반을 방지하며, 비즈니스 로직의 신뢰성을 높이는 데 큰 역할을 합니다.
특히 금융업에서 트랜잭션의 성질을 지키지 못한다면 누군가는 소중한 자산을 전산오류를 통해 돈을 잃게 되고 누가 돈을 맡기려 할까요?
금융업 뿐 아니라 모든 IT 서비스는 데이터 기반으로 애플리케이션이 동작하고 수행되며 그 가치를 지니게 됩니다. 그래서 트랜잭션을 통해 비즈니스 로직을 지켜내고 그 과정에 ACID가 있다고 생각합니다.
마지막으로, ACID는 데이터베이스 트랜잭션에 중요한 개념이지만, 분산 시스템 및 대규모 애플리케이션에서는 이러한 속성을 유지하기가 어려울 수 있으며, 이런 경우에는 CAP 이론과 같은 다른 개념도 고려해야 할 수 있습니다.
오늘은 트랜잭션에 대해 알아보았습니다. 환절기라 제 목이 따끔따끔 거리네요. 가장 감기를 조심해야 할 시기인 만큼 여러분도 건강 꼭 챙기셔야 합니다.
그럼 다음 시간에 찾아오도록 하겠습니다.
'Database' 카테고리의 다른 글
GA4 (Google Analytics 4) (1) | 2023.09.27 |
---|---|
MyBatis 성능 개선포인트 (0) | 2023.09.27 |
Cloud Composer의 내부DB 접근 (0) | 2023.09.14 |
문서 검색 챗봇 만들기 (0) | 2023.09.13 |
[Airflow] Celery Executer (0) | 2023.09.04 |
댓글