본문 바로가기
Database

[MySQL] 트랜잭션 (Transaction)

by yonikim 2024. 1. 5.
728x90

 

트랜잭션(Transaction) 이란?

트랜잭션(Transaction) 의 사전적 의미는 거래이고, 

컴퓨터 과학 분야에서 트랜잭션(Transaction) 은 더 이상 분할이 불가능한 업무처리의 단위 를 의미한다.

 

이것은 하나의 작업을 위해 더이상 분할될 수 없는 명령어들의 모음. 즉, 한꺼번에 수행되어야 할 일련의 연산모음을 의미한다. 

 

데이터베이스와 어플리케이션의 데이터 거래에 있어서 안전성을 확보하기 위한 방법이 트랜잭션인 것이다.

따라서 데이터베이스에서 테이블의 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면

결과를 재반영 하는 것이 아니라 모든 작업을 원상태로 복구하고, 처리 과정이 모두 성공하였을 때만 그 결과를 반영한다.

 


 

MySQL 트랜잭션 


MySQL에서 트랜잭션은 데이터베이스 시스템에서 수행되는 작업의 기본 단위이다. 

사실 우리가 MySQL의 입력하는 모든 쿼리 명령어들은 각각 하나의 트랜잭션이라고 할 수 있다.

INSERT, DELETE, UPDATE 등의 SQL 명령문을 통해 데이터 상태를 바꿀 때마다 내부적으로 자동적으로 Commit 을 실행하여 변경된 내역을 데이터베이스의 반영하는 것이다. 

즉, 여태까지 입력한 명령어들은 MySQL 에서 자동 Commit 을 통해 쿼리 입력과 동시에 처리하여 데이터베이스에 반영되게 한 것이다. 

 


트랜잭션 특징 


1. 사용자 A와 사용자 B가 각각의 은행 계좌를 가지고 있다.
2. 사용자 A가 사용자 B에게 100달러를 송금하려고 한다. 

 

은행 송금 작업을 트랜잭션으로 처리하는 과정은 다음과 같다. 

 

1. 원자성 (Atomicity) 

트랜잭션은 원자적인 단위로 처리되어야 한다. 즉, 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.

 

사용자 A의 계좌에서 100달러가 감소하고, 사용자 B의 계좌에 100달러가 증가하는 두 가지 작업이 모두 성공적으로 수행되거나, 아무런 변경도 일어나지 않아야 한다. 하나의 작업이라도 실패하면 트랜잭션은 롤백되어야 한다.

 

트랜잭션은 사람이 설계한 논리적인 작업 단위로서, 일처리는 작업단위 별로 이뤄져야 데이터를 다루는데 무리가 없다.

만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들뿐만 아니라 오작동 했을시 원인을 찾기 매우 힘들어질 것이다.

 

 

2. 일관성 (Consistency)

트랜잭션이 시작하기 전과 끝난 후에는 데이터베이스는 일관된 상태여야 한다.

 

사용자 A의 계좌에서 100달러가 감소하고, 사용자 B의 계좌에 100달러가 증가한 후에는 잔액의 합계는 변하지 않아야 한다.

 

트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 베이터베이스로 진행된다.

이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.

 

 

3. 독립성 (Isolation)

여러 트랜잭션이 동시에 실행되고 있는 경우, 각 트랜잭션은 다른 트랜잭션에 영향을 미치지 않아야 한다. 

하나의 특정 트랜잭션이 완료될 때까지 다른 트랜잭션은 특정 트랜잭션의 결과를 참조할 수 없다.

 

다수의 사용자가 동시에 송금을 시도하더라도 각각의 트랜잭션은 독립적으로 처리돼야 한다. 

 

 

4. 영구성 (Durability)

트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영돼야 한다. 즉, 데이터베이스에 반영된 변경은 시스템 장애 또는 재시작에도 계속해서 유지되어야 한다. 

 

 


트랜잭션 상태 


트랜잭션의 개념은 서술한 바와 같이 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 혹은 데이터베이스 시스템에서 복구 및 병행 수행시 처리되는 작업의 논리적 단위이다. 

 

트랜잭션의 연산과정의 단계를 도식화하고 각각의 단계의 상태를 그림과 같이 정리할 수 있는데, 개별 상태에 대한 상세는 다음과 같다.

 

1. 활성(Active)

트랜잭션이 정상적으로 실행중인 상태를 의미한다. 트랜잭션이 시작되면 해당 트랜잭션의 상태는 활동(Active) 상태가 된다. 

 

2-1. 작업 성공시

1) 부분 완료(Partially Committed)

트랜잭션이 성공적으로 실행되고, 모든 작업이 완료되어 데이터베이스에 적용되기 직전(Commit 연산이 실행되기 직전)의 상태이다. 

모든 작업이 완료되면 트랜잭션은 완료 상태로 이동한다. 

 

2) 완료(Committed)

트랜잭션이 성공적으로 실행되어 모든 작업이 데이터베이스에 반영되고, 트랜잭션이 종료된 상태이다. 이후에는 더 이상 롤백이 불가능하며, 트랜잭션은 완전히 종료된다.

 

설계된 트랜잭션대로 명령을 성공적으로 수행하면 그 다음 상태는 부분적 완료(Partially Committed) 상태가 된다. 

설계된 작업대로 작업이 성공하였다고 하여 무조건 반영하는 것이 아니라, 설계자의 최종 승인(Commit) 이 있을 때까지 실제 데이터베이스에 작업 내용을 반영하지 않고 기다리고 있는 상태이다. 

설계자가 작업 결과에 대하여 반영을 승인(Commit) 한다면 트랜잭션이 성공적으로 종료된다. (Committed) 

 

2-2. 작업 성공시

1) 실패(Failed)

트랜잭션이 실패하면 이 상태로 이동한다. 실패는 트랜잭션이 중단되었거나 오류가 발생했을 때 발생한다. 

이후에는 롤백이나 복구 작업을 수행하여 트랜잭션을 정상 상태로 되돌릴 필요가 있다.

 

2) 철회(Aborted)

트랜잭션이 실패하거나 중단되면 이 상태로 이동한다. 트랜잭션이 중단되었을 경우 데이터베이스를 이전의 상태로 되돌릴 때 사용된다.

 

트랜잭션을 수행하는 중간에 모종의 원인으로 인하여 오류가 발생하여 실행이 중단된 상태를 실패(Failed) 상태라고 한다.

이때 트랜잭션이 비정상적으로 종료되었으니 설계되어 있는 트랜잭션 내부의 작업을 다시 수행 이전의 상태로 돌리는 Rollback 연산을 수행하면 그 상태를 철회(Aborted) 라고 한다. 

 

 


더 나아가기 

 

 

Commit 

Commit 은 데이터베이스에서 트랜잭션의 변경 사항을 영구적으로 적용하고, 데이터베이스를 일관된 상태로 만들기 위한 SQL 명령문이다.

트랜잭션은 Commit 명령을 통해 성공적으로 완료된 경우에만 변경 내용이 영구적으로 저장되며, 이후에는 Rollback 이 불가능하게 된다.

 

Commit 명령은 아래와 같은 역할을 수행한다.

 

1. 트랜잭션 완료

Commit 명령은 트랜잭션이 성공적으로 완료되었음을 나타낸다. 트랜잭션이 완료되면 해당 트랜잭션은 더 이상 변경을 수용하지 않는다.

2. 변경사항을 데이터베이스에 반영

Commit 이 실행되면 트랜잭션 중에 수행된 변경 사항이 실제 데이터베이스에 반영되어 영구적으로 저장된다.

3. 트랜잭션 종료

Commit 은 트랜잭션을 종료한다. 이후에는 해당 트랜잭션에 대한 추가 작업이나 롤백이 불가능하며, 새로운 트랜잭션을 실행할 수 있다. 

-- 트랜잭션 시작
START TRANSACTION;

-- 데이터베이스에 변경 사항 적용
UPDATE users SET balance = balance - 100 WHERE user_id = 1;
UPDATE users SET balance = balance + 100 WHERE user_id = 2;

-- 변경 사항을 영구적으로 저장하고 트랜잭션 종료
COMMIT;

 

 

Rollback

Rollback 은 데이터베이스에서 트랜잭션의 변경사항을 취소하고, 트랜잭션을 이전의 일관된 상태로 되돌리는 SQL 명령문이다.

트랜잭션 도중에 오류가 발생하거나 트랜잭션을 취소해야 할 때 사용된다. 

 

Rollback 명령이 수행되면 아래와 같은 일이 발생한다.

 

1. 트랜잭션 취소

Rollback 명령은 트랜잭션을 취소하고, 트랜잭션이 시작된 이후의 모든 변경사항을 취소한다.

2. 데이터베이스 복구

트랜잭셔이 Rollback 되면 데이터베이스는 트랜잭션 시작 이전의 일관된 상태로 복구된다. 즉, Rollback 이전의 상태로 돌아가게 된다. 

3. 트랜잭션 종료

Rollback 은 트랜잭션을 종료한다. 이후에는 해당 트랜잭션에 대한 추가 작업이나 Commit 이 불가능하며, 새로운 트랜잭션을 시작할 수 있다.

-- 트랜잭션 시작
START TRANSACTION;

-- 데이터베이스에 변경 사항 적용
UPDATE users SET balance = balance - 100 WHERE user_id = 1;
UPDATE users SET balance = balance + 100 WHERE user_id = 2;

-- 트랜잭션 취소하고 변경 사항 롤백
ROLLBACK;

 


 

트랜잭션 예외(Exception)

트랜잭션에서 예외는 일반적으로 트랜잭션의 실행 도중에 오류가 발생했음을 나타낸다. 트랜잭션 내에서 예외가 발생하면 트랜잭션은 롤백될 수 있으며, 변경사항은 취소되어 이전 상태로 복구될 수 있다. 

 

트랜잭션에서 예외 상황은 다양한 이유로 인해 발생할 수 있는데, 몇가지 일반적인 예외 상황은 다음과 같다.

 

1. 무결성 제약 조건 위반

데이터베이스에 정의된 무결정 제약 조건을 위반하는 작업이 트랜잭션에서 수행되면 예외가 발생할 수 있다. 예를 들어, 유일성 제약 조건(Unique Constraint)에 위반된 데이터를 삽입하려고 할 때 예외가 발생할 수 있다.

2. 데이터베이스 잠금 충돌 

다중 사용자 환경에서 여러 트랜잭션이 동시에 실행되는 경우, 데이터베이스 잠금 충돌이 발생할 수 있다. 두 트랜잭션이 동일한 데이터에 대해 동시에 작업하려고 할 때 예외가 발생할 수 있다. 

3. 일관성 없는 상태 

트랜잭션 내에서 데이터를 일관성 없는 상태로 만드는 작업이 수행되면 예외가 발생할 수 있다. 예를 들어, 부모-자식 테이블 간의 참조 무결성을 위반하는 경우 예외가 발생할 수 있다.

 


 

DDL 트랜잭션 

DDL(데이터 정의 언어) 은 데이터베이스 객체를 정의하거나 구조를 변경하는 명령어를 포함한다.  

DDL 에는 CREATE, ALTER, DROP 등이 포함되며, 이러한 명령어들은 데이터베이스의 스키마를 조작한다. 

 

일반적으로 DDL문은 실행 시점에 자동으로 커밋되기 때문에, 실행하면 해당 작업이 즉시 데이터베이스에 반영된다. 이로 인해 DDL 트랜잭션은 일반적인 트랜잭션과는 몇가지 다른 특성을 가진다. 

 

1. 자동 커밋

대부분의 데이터베이스 시스템에서 DDL 문은 실행시 자동으로 커밋되기 때문에 명시적인 Commit 이 필요하지 않다.

2. 트랜잭션 제어 불가

DDL 트랜잭션은 일반적인 트랜잭션과 달리 롤백되거나 커밋되지 않는다. DDL 문이 성공하면 변경사항이 영구적으로 반영되고, 실패하면 해당 문에서 오류가 발생한다. 

3. 트랜잭션 경계 

DDL 문은 트랜잭션의 경계를 정의하지 않는다. 즉, 여러 DDL 문을 하나의 트랜잭션으로 묶을 수 없다. 

4. 애플리케이션 재시작 필요

DDL 문이 실행되면 데이터베이스의 스키마가 변경되므로, 이후에 실행되는 쿼리나 트랜잭션에는 변경된 스키마가 반영된다. 따라서 DDL 문이 실행된 후에는 종종 애플리케이션을 재시작하는 것이 좋을 수 있다.

 

 

 

 

 

References

[MYSQL] 📚 트랜잭션(Transaction) 개념 & 사용

728x90

'Database' 카테고리의 다른 글

[Mongo] 백업 및 복원하기  (0) 2021.08.27