본문 바로가기

MySQL

[MySQL]트랜잭션

트랜잭션?

데이터베이스의 상태 변화를 수행하는 작업의 단위를 뜻한다.

상태 변화란 SQL문이 실행되어 데이터베이스에 접근하는 것을 의미하는데,

예를 들어 게시물 업데이트 후 새로고침이 필요할 때 UPDATE 실행 후 SELECT가 실행되는데, UPDATE와 SELECT를 합친 것이 하나의 트랜잭션이라 볼 수 있다.

 

트랜잭션의 4가지 특성(ACID)

1. 원자성(Atomicity)

더 이상 쪼갤 수 없는 작업 단위로써, 정상적으로 함께 수행되거나 전혀 수행되지 않음을 보장해야 한다.

"All or Nothing"으로 많이 표현된다.

 

2. 일관성(Consistency)

트랜잭션의 수행은 DB의 일관성을 보존해야 하는데, 트랜잭션이 성공한 경우 기존 PK/FK 같은 무결성 제약 조건이나 데이터 간 정합성이 일치하는 상태가 유지되어야 한다.

 

3. 독립성(Isolation)

여러 트랜잭션이 동시에 실행 되더라도, 각 트랜잭션은 다른 트랜잭션과 독립적으로 수행되어야 한다.

독립성은 트랜잭션이 순차적으로 실행되는 것이 가장 좋지만, 병렬적으로 수행되는 상황에서도 순차적으로 실행되는 것 처럼 보여야 한다.

또한, 트랜잭션의 중간 과정이 다른 트랜잭션에게는 숨겨지고 영향을 주지 않아야 한다.

만약 영향을 받게 될 경우 ROLLBACK 되어도 원래의 상태로 되돌아 오지 않을 수 있다.

 

4. 지속성(Durability)

성공적으로 트랜잭션이 수행되었다면, 결과는 다른 트랜잭션에 의해 변경되기 전 까지 변하지 않고 보존되어야 한다.

 

ROLLBACK

트랜잭션이 종료되기 전 트랜잭션의 처리가 비정상적으로 종료되었거나, 원자성이 깨졌을 경우 잘못된 부분으로 돌릴 수 있는 기능이다.

트랜잭션이 처리된 단위로 다시 돌아갈 수 있다. 이는 완전히 처음으로도, 성공한 곳 까지 돌아갈 수 있는 스냅샷과 같다.(라는 저의 생각입니다.)

 

COMMIT

COMMIT이란 하나의 트랜잭션이 정상적으로 종료되었음을 의미한다.

COMMIT 명령어를 입력한다면 수행한 트랜잭션은 로그에 저장되고, ROLLBACK을 실행할 때 하나의 단위로 볼 수 있다.

예시를 보자.

트랜잭션이 시작되고, 새로운 유저를 insert 해보았다.

유저는 들어간 것을 확인할 수 있다.

 

하지만, COMMIT을 하지 않은 상태에서 ROLLBACK을 해보자.

다시 COMMIT이 된 부분까지만 select 된 것을 볼 수 있다.

 

그럼 새로 저장된 USER를 COMMIT 후 ROLLBACK 해보자.

COMMIT 후 ROLLBACK을 하면 마지막 커밋한 부분까지 출력된다.