트랜잭션
- 데이터베이스 내에서 데이터를 처리하는 작업 수행의 논리적인 작업 단위를 의미
- 트랜잭션은 완전성을 보장한다. 논리적인 작업 셋을 모두 완벽하게 처리하거나 (COMMIT) 또는 아무것도 적용되지 않아야 함(ROLLBACK)을 보장해주는 것
- 사용자의 입장 : 작업의 논리적 단위
- 시스템의 입장 : 데이터들을 접근 또는 변경하는 프로그램의 단위
온라인 쇼핑몰에서 주문을 했다고 상황을 가정해보자
1. 내 계좌에서 돈을 인출 및 이체
2. 내 계좌에서 잔액이 차감
3. 업체에는 내 이름으로 돈이 입금
4. 업체 계좌에 잔액이 더해진다
//BEGIN TRAN : 트랜잭션 걸게되는 경우
UPDATE accounts
SET balance = balance - 10000
WHERE user = '구매자';
UPDATE accounts
SET balance = balance + 10000
WHERE user = '판매자'
//COMMIT TRAN
만약 내 계좌에서는 돈이 빠져나갔지만 쇼핑몰 업자에게는 입금이 되지 않은 경우 내 계좌의 인출 작업이 취소 되어야한다.
처리하는 과정에서 문제 발생 시 진행 중이던 작업을 취소하고 처음부터 다시 시작해야한다
트랜잭션 메커니즘
- UPDATE 구매자 쿼리를 실행한다 .
- 업데이트에 필요한 데이터를 데이터 캐시에 요청을 하는데 데이터 캐시에 해당 데이터가 없다.
- 데이터 파일에서 데이터를 가져와야 한다.
- 데이터 캐시에 필요한 데이터가 로드
User | Balance |
구매자 | 10000 |
5.데이터가 로드 된 후 업데이트를 진행 , 그 전에 로그 캐시에 로그를 기록해야 한다.
6.ReDo로그와 UnDo로그에 기록을 한다.
7.데이터가 로드 된 후 업데이트를 진행 , 그 전에 로그 캐시에 로그를 기록해야 한다.
8.ReDo로그와 UnDo로그에 기록을 한다.
9.이 때 ReDo 로그는 변경 후의 값을 기록하고 UnDo 로그는 변경 전의 값을 기록한다.
10.로그 기록 후 데이터 캐시에 있는 값을 변경하면 된다.
User | Balance |
구매자 | 0 |
트랜잭션의 4가지 특징 (ACID)
- 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성, 일관성, 독립성, 지속성을 보장
- ACID : 트랜잭션이 안전하게 수행되는 것을 보장하기 위한 성질
Atomicity (원자성)
Consistency (일관성)
Isolation (독립성)
Durability (지속성)
1. 원자성
- 트랜잭션이 데이터베이스에 모두 반영되던지 , 아니면 전혀 반영 되지 않아야 함
- 트랜잭션 내의 모든 명령은 반드시 완벽하게 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야한다
2. 일관성
- 트랜잭션의 작업 처리 결과가 항상 일관성 있어야 한다.
- 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 수행 완료 후의 상태가 같아야 한다.
3. 독립성, 격리성
- 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없다.
- 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
- 동시성과 관련된 성능 이슈로 인해서 격리 수준 선택이 가능하다.
4. 영속성, 지속성
- 트랜잭션이 성공적으로 완료되었을 경우, 그 결과는 영구적으로 반영되어야 한다. (데이터베이스 로그 사용 등 )
트랜잭션 연산 및 상태
1. Commit 연산
- 한개의 논리적 단위에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
2. Rollback 연산
- Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산
활성(Active)
: 트랜잭션이 정상적으로 실행중인 상태
실패(Failed)
: 트랜잭션 실행에 오류가 발생하여 중단된 상태
철회, 취소(Aborted)
: 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
부분 완료(Partially Committed)
: 트랜잭션의 Commit 명령이 도착한 상태, 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
완료(Committed)
: 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
부분완료와 완료의 차이
commit요청이 들어오면 상태는 부분완료 상태가 된다. 이후 commit을 문제없이 수행 할 수 있다면 완료 상태로 전이되고, 만약 오류가 발생하면 실패 상태가 된다. 즉, 부분완료는 commit요청이 들어왔을 때를 말하며, 완료 상태는 commit을 정상적으로 완료한 상태를 의미한다.
트랜잭션의 범위를 최소화해라
트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.
일반적으로 데이터베이스 커넥션은 개수가 제한적이다. 이 때 각 단위 프로그램이 커넥션을 소유하는 시간이 길어지는 경우 사용 가능한 여유 커넥션의 개수는 줄어들게 된다. 그러다보면 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있다.
레퍼런스)
DB 트랜잭션 (Transaction)의 ACID 속성과 분산시스템 BASE 속성
트랜잭션이란 무엇인가? ACID 특성과 BASE 특성에 대해 알아보자.
velog.io
[DB] 트랜잭션(Transaction)이란? | ACID
트랜잭션(Transaction)이란? 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다. 트랜잭션은
code-lab1.tistory.com
참고 ) 고립수준
[DB] 트랜잭션의 고립(격리) 수준(Isolation Level) | 고립 수준 예시
트랜잭션의 고립 수준(Isolation Level)이란? 트랜잭션의 고립 수준이란 트랜잭션들끼리 일관성 있는 데이터를 얼마나 허용할 것인지 정해놓은 수준이다. 즉, 트랜잭션 수행 중 다른 트랜잭션이 해
code-lab1.tistory.com