일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- OOP
- 디자인패턴
- MYSQL
- 스프링 시큐리티
- spring boot
- 관점지향프로그래밍
- request
- Spring Security
- SQL
- Interceptor
- Filter
- exception
- network
- Redis
- aop
- java
- RestControllerAdvice
- http
- 인터셉터
- git
- mybatis
- response
- 스프링
- 트랜잭션
- 객체지향프로그래밍
- Spring
- aspect
- 자바
- 스프링부트
- proxy pattern
- Today
- Total
장쫄깃 기술블로그
[MySQL] DB Transaction(트랜잭션) 이란? 본문
Transaction, 트랜잭션
트랜잭션(Transaction) 이란, 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다.
하나의 작업을 수행하기 위해 필요한 데이터베이스 연산 기능들을 모아놓은 것이며 분리되지 않도록 하여 작업의 완전성을 보장한다.
트랜잭션을 통해서 데이터베이스의 회복과 병행 제어가 가능하다. 즉, 데이터베이스에서 오류가 발생하는 경우의 빠른 회복이나, 여러 사용자가 동시에 데이터베이스를 사용할 수 있도록 제어해주는 중요한 역할을 한다.
데이터베이스의 연산을 SQL문으로 표현한다면, 하나의 작업을 수행하는 SQL문의 집합으로 생각할 수도 있다.
트랜잭션의 특징
트랜잭션이 성공적으로 처리되기 위해서는 ACID라는 네 가지 성질을 만족해야 한다.
1. 원자성 (Automicity)
트랜잭션을 구성하는 연산은 반드시 모두 실행이 되거나 혹은 아예 실행되지 않아야 한다. 즉, 하나의 트랜잭션에서 일부 연산만 실행되면 안 된다.
따라서 실행 도중에 오류가 발생하여 작업을 완료하지 못하였다면, 트랜잭션 전체를 취소하여 수행 이전으로 돌아가야 한다.
2. 일관성 (Consistency)
트랜잭션이 완료된 상태에서도 트랜잭션 이전의 상황과 동일하게 데이터의 일관성이 있어야 한다. 데이터에 모순이 있어서는 안 된다.
은행 송금 기능을 생각해보면, 트랜잭션 수행 이전의 송금자와 수금자의 잔액 합이 수행 후에 달라지거나, 혹은 잔액을 나타내는 자료형이 정수형에서 문자열로 바뀌는 등의 모순이 발생하면 안 된다.
3. 독립성, 격리성 (Isolation)
트랜잭션은 다른 트랜잭션에 간섭을 주거나 받지 않고 독립적으로 수행되어야 한다.
둘 이상의 트랜잭션이 병행 실행되는 경우, 현재 수행 중인 트랜잭션이 완료되기 전에 현재 트랜잭션이 생성한 중간 연산 결과를 다른 트랜잭션이 접근하면 안 된다.
독립성을 통해서, 사용자들은 여러 트랜잭션이 동시에 수행되고 있는 것처럼 느끼면서도 정확한 결과를 얻을 수 있게 된다.
4. 지속성 (Durability)
트랜잭션이 성공적으로 완료되었을 때 그 결과는 영구적으로 반영되어야 한다. 시스템의 장애가 발생하더라도 결과는 데이터베이스에 그대로 남아있어야 하며, 지속성을 보장하기 위해서 회복 기능이 필요하다.
트랜잭션의 연산
트랜잭션의 연산으로는 크게 Commit과 Rollback 두 가지가 있다.
1. Commit 연산
Commit 연산은 하나의 트랜잭션이 성공적으로 종료된 후, 데이터베이스가 일관된 상태를 유지할 때 갱신 연산이 완료되었다고 트랜잭션 관리자에게 알려주고 결과를 최종적으로 데이터베이스에 반영하는 연산이다.
2. Rollback 연산
Rollback 연산은 하나의 트랜잭션이 비정상적으로 종료되어 데이터베이스의 일관성을 잃었을 때 트랜잭션이 지금까지 실행한 연산의 결과가 취소되고 트랜잭션 수행 이전의 상태로 돌아가는 연산이다.
Rollback을 하는 경우엔 해당 트랜잭션을 재시작하거나 폐기한다.
트랜잭션의 상태
트랜잭션의 연산을 수행할 때, 트랜잭션의 5가지 상태가 존재하며, 과정은 아래의 그림과 같다.
1. 활성화(Active) : 트랜잭션이 작업을 시작하여 실행 중인 상태
2. 실패(Failed) : 트랜잭션에 오류가 발생하여 실행이 중단된 상태
3. 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
4. 부분 완료(Partially commited) : 트랜잭션의 마지막 연산까지 실행하고 commit 요청이 들어온 직후의 상태
최종 결과를 데이터베이스에 아직 반영하지 않은 상태
5. 완료(Commited) : 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 후의 상태
'DataBase > MySQL' 카테고리의 다른 글
[MySQL] STRAIGHT_JOIN (2) | 2022.09.12 |
---|---|
[MySQL] INSERT IGNORE, REPLACE INTO (0) | 2022.09.02 |
[MySQL] DUPLICATE ON KEY UPDATE (0) | 2022.09.02 |