컴퓨터/MySQL

MySQL (10) - Transaction(트랜잭션)에 대하여 알아보자

달서비 2023. 3. 23. 21:46

DB 서버를 운영하다 보면 종종 데이터를 잘못 입력하여 서버가 꼬이는 경우가 있습니다. DB에는 트랜잭션이라는 개념이 있습니다. 트랜잭션을 제어하는 경우 어느 정도 해당 문제를 해결할 수 있습니다. 

 

트랜잭션이란?

트랜잭션(Transaction)은 DB의 상태를 변환시키는 작업 단위 혹은 한 번에 모두 수행하여야 하는 연산들의 모음을 말합니다. 한마디로 쪼갤 수 없는 작업의 최소 단위를 말합니다.

 

SQL에 자주 사용하는 4가지의 쿼리문이 있습니다. (SELECT, INSERT, UPDATE, DELETE)

위의 쿼리중 1가지만 사용하는 경우도 작업의 단위가 될 수 있습니다. 하지만 이것에 벗어나 예를 들어 게시글을 작성하고, 업로드하며, 마지막으로 다시 게시판에 조회하는 경우 이것을 묶어 작업하는 것도 단위가 될 수 있습니다.

 

트랜젝션의 특징

트랜젝션은 크게 4가지의 특징을 가지고 있습니다.

  • 원자성 (Atomicity)
  • 일관성 (Consistency)
  • 독립성 (Isolation)
  • 영속성 (Durability)

먼저 원자성트랜잭션이 DB에 모두 반영되던지 혹은 전혀 반영되지 않아야합니다. 트랜젝션 내의 명령은 완벽하게 수행되어야 하며, 모두가 완벽히 수행되지 않고 오류가 발생하면 트랜젝션이 취소되어야합니다.

두번째로 일관성트랜잭션의 작업 처리 결과는 일관성 있는 DB 상태를 가져야 합니다. 또한 시스템이 가지고 있는 고정요소는 트랜잭션 수행전후 상태가 같아야 합니다.

세번쨰로 독립성은 둘 이상의 트랜잭션이 동시에 실행되는 경우 하나의 트랜잭션 실행중에 다른 트랜잭션이 끼어들어 연산을 할수 없습니다. 트랜잭션이 완료될 떄까지 다른 트랜잭션에서 수행 결과를 참조할 수 없습니다.

마지막으로 영속성은 성공적으로 완료된 경우 해당 결과는 영구히 반영되어야합니다.

 

트랜젝션 연산 및 상태

MySQL에서는 3가지 트랜잭션 명령어가 있습니다.

  • COMMIT
  • ROLLBACK
  • SAVEPOINT

 

COMMIT

START TRANSACTION; -- 트랜잭션 시작

select * from mytable; -- 초기값
insert into mytable values(1, 'hello', 'world'); -- 테이블에 1개 칼럼 생성
select * from mytable; -- 수정 상태 보여줌

COMMIT; -- 트랜잭션 적용

select * from mytable; -- 결과 조회

COMMIT은 트랜션이 끝났고 DB가 일관성 있는 상태일 때, 작업이 완료되었다는 것을 알려줍니다. 해당 명령 실행되면 로그에 저장하여 데이터를 되돌릴 수 있도록 도와줍니다. 해당 예제에서 생성된  칼럼은 COMMIT 명령을 통해 DB 서버에 적용됩니다.

 

ROLLBACK

START TRANSACTION; -- 트랜잭션 시작

select * from mytable; -- 초기값
insert into mytable values(1, 'hello', 'world'); -- 테이블에 1개 칼럼 생성
select * from mytable; -- 수정 상태 보여줌

ROLLBACK -- 트랜잭션 취소 및 START TRANSACTION 이전 상태로 롤백함

select * from mytable; --  조회

ROLLBACK은 하나의 트랜잭션이 비정상적으로 종료되어 원자성이 깨진 경우 트랜잭션을 이전상태로 되돌립니다. 이를 통해 처음부터 다시 시작하거나, 부분적으로 연산한 결과를 취소할 수 있습니다. 해당 예제에서 생성된 칼럼은 ROLLBACK 명령을 통해 적용되지 않습니다.

 

SAVEPOINT

START TRANSACTION; -- 트랜잭션 시작

SAVEPOINT A;
insert into mytable values(1, 'hello', 'world'); -- 테이블에 1개 칼럼 생성

SAVEPOINT B;
insert into mytable values(1, 'hello', 'world'); -- 테이블에 1개 칼럼 생성

SAVEPOINT C;
insert into mytable values(1, 'hello', 'world'); -- 테이블에 1개 칼럼 생성


ROLLBACK TO SAVEPOINT B -- SAVEPOINT B 위치로롤백
select * from mytable; --  조회

SAVEPOINT는 ROLLBACK을 할 때 지정 위치를 표시합니다. 이를 통하여 작업 중인 중간지점으로 복구할 수 있습니다. 위의 예제는 칼럼을 세 개 만들었습니다. 그리고 추가하기 전 SAVEPOINT A, B, C를 두었습니다. 밑에서 두 번째 명령어를 통해 B 이전의 작업이 모두 롤백 됩니다. 따라서 mytable에는 SAVEPOINT A에서 삽입된 1개의 행만 남게 됩니다.