트랜잭션이 뭘까?
일이 처리되기 위핸 가장 작은 단위이다.
내가 B라는 대상자에게 10,000원을 계좌이체 한다고 하자.
1. 내 통장의 잔액 10,000원 감소
2. B 통장의 잔액 10,000원 증가
→ 1.인출과 2.입금이라는 두 과정이 있다.
→ 1.인출만되고, 2.입금은 실패하면 치명적인 결과가 나온다.
이 두 과정은 동시에 성공하던지 동시에 실패해야한다.
이 두 과정을 동시에 묶는 방법이 트랜잭션이다.
즉 이것을 데이터 베이스와 어플리케이션의 데이터 거래 에 있어서 안정석을 확보하기 위한 방법이 트랜잭션이다.
→ 따라서 데이터베이스에서 테이블을 읽어 온 후 다른 테이에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면 결과를 재반영 하는 것이 아닌 모든 작업을 원상태로 복구하고, 처리 과정이 모두 성공하였을 때 만 그 결과를 반영한다.
트랜잭션 용어
COMMIT
- 트랜잭션에서 실행된 변경 사항을 데이터베이서에 영구적을 저장하는 작업이다. Commit 후에는 변경 내용을 다른 사용자도 볼 수 있다.
Rollback
- 트랜잭션 내에 발생한 변경사항을 취소하고 트랜잭션 시작 지점으로 상태를 되돌리는 작업이다. 트랜잭션을 실패하거나 오류가 발생한 경우, 데이터 무결성을 유지하기 위해 서용된다.
Auto Commit 설정
Auto Commit 의 각 SQL이 실행될 때 자동으로 Commit 되는 설정이다. Auto Commit이 활성화 된 상태에서는 트랜잭셔늘 명시적으로 시작하지 않아도 쿼리 실행 결과가 즉시 데이터베이스에 반영된다.
트랜잭션의 성질 ACID
Atomicity(원자성)
- 더 이상 쪼개질 수 없는 단위.
- 모두 성공하거나, 모두 실패해야한다.
Consistency(일관성)
- Transaction 전후로 데이터가 일정해야함
- 트랜잭션 실행 전 후에 데이터베이스는 항상 유호한 상태를 유지해야한다.
- 데이터베이스가 판단하기는 어렵고 어플리케이션 단에서 관리해야한다.
- ex) 마지막 한 개 남은 상품을 동시에 2명의 고객이 주문할 수 없도록
Isolation(격리)
- 동시에 발생하는 transaction이 서로의 영향을 받지 않도록 격리되어야 한다.
Durability(지속성)
- Commit 된 transaction은 시스템 오류가 발생하더라도 변경 사항이 손실되지 않는다.
트랜잭션 격리 수준
트랜잭션 격리 수준은 동시에 실행되는 트랜잭션 간의 상호작용 방식을정의하며, 데이터 무결성과 성능 간의 균형을 결정한다.
SQL 표준기준 4가지 격리 수준
- READ UNCOMMITTED
- 트랜잭션이 Commit 되지 않은 데이터를 다른 트랜잭션이 읽을 수 있다.
- 데이터 일관성이 낮으면 Dirty Read가 발생할 수 있다.
- 성능은 높지만, 데이터 무결성이 떨어진다.
- READ COMMITTED
- 트랜잭션이 Commit 된 데이터만 읽을 수 있다.
- Dirty Read는 방지되지만 Non-Repeatable Read 가 발생ㅎ나다.
- 대부분의 RDBMS에서 기본 격리 수준으로 설정된다.
- REPEATABLE READ
- 트랜잭션 동안 동일한 데이터를 반복해서 읽으면 항상 같은 결과를 보장한다.
- Non-Repeatable Read는 방지되지만, Phantom Read가 발생할 수 있다.
- MySQL InnoDB의 기본 격리 수준
- SERIALIZABLE
- 가장 높은 수준의 격리 수준, 트랜잭션 간의 완전한 격리를 제공한다.
- Phantom Read도 방지되며, 트랜잭션은 직렬적으로 실행된다.
- 성능이 낮지만, 데이터 무결성이 최상으로 보장
'Database' 카테고리의 다른 글
[데이터베이스] 락과 DB 회복 (0) | 2024.11.28 |
---|---|
[데이터베이스] 이상과 정규화 (0) | 2024.11.21 |
[데이터베이스] 인덱스 (2) | 2024.11.14 |
[데이터베이스] B-Tree 인덱스와 B+Tree 인덱스 (0) | 2024.11.13 |
[데이터베이스] 순차 I/O와 랜덤 I/O (2) | 2024.11.12 |