본문 바로가기

데이터베이스

MySQL 트랜잭션 개념과 예제

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

트랜잭션


트랜잭션
데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다.
여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
 
-위키백과-

간단히 말해서, 트랜잭션이란 데이터베이스에서 여러 명령이 묶인 작업의 한 단위를 의미합니다.

트랜잭션으로 명령들의 묶음을 한 단위로 만들어 단위만큼 한꺼번에 DB에 명령을 반영한다던가

단위만큼 한꺼번에 DB에서 명령을 취소한다던가 하는 행위가 가능합니다.

 

트랜잭션은 보장한다는 것은 ACID(원자성, 일관성, 격리성, 내구성)를 보장한다는 것입니다.

ACID는 그 내용이 깊어 다음에 큰 주제로 다루도록 하고,

오늘은 원자성 중에서도 commit과 rollback만을 다뤄보겠습니다.



 

스토리지 엔진


MySQL에서는 스토리지 엔진에 따라 트랜잭션의 지원 여부가 달라지므로 스토리지 엔진에 대해서 알아야 합니다.

 

이미지 출처 : mysqldba.tistory.com/2

mysql 구조

위 그림에서 보면 다양한 storage engine이 있다는 것을 알 수 있습니다.

이중 대표적으로 MyISAM, InnoDB가 있습니다.

MyISAM은 예전부터 오래 사용해오던 storage engine이고 예전 DB들이 이를 이용하여 짜인 경우가 많아, 호환성을 위해 아직도 사용됩니다.

InnoDB는 현재 mysql에서 default storage engine으로 채택하고 있고, MyISAM에 비해 최신 엔진이기 때문에 업그레이드된 기능들을 제공합니다.

 

실제 MySQL에서 이런 엔진들이 제공하는 기능을 확인해 볼 수 있습니다.

MySQL 대표엔진

보기에 InnoDB가 더 많고, 업그레이드된 기능을 제공하고 있는 것을 확인할 수 있습니다.


 

예제


MySQL에서는 디폴트로 auto commit이 설정되어있습니다.

명령어를 한 번, 그러니까 세미콜론을 한 번 찍을 때마다 DB에서 자동으로 commit 해주는 시스템입니다.

 

auto commit 설정

위와 같이 설정된 것을 확인할 수 있습니다.

물론 이를 해제하고 진행해도 되지만,

start transaction 명령어를 통해 트랜잭션을 시작할 수 있으므로 그렇게 진행했습니다.

 

 

트랜잭션을 시작한 모습입니다.

 

레코드를 삽입했습니다.

 

위와 같이 실행이 취소된 모습을 볼 수 있습니다.



 

SavePoint


트랜잭션 중간에 save point를 지정하여, 그곳까지만 롤백하는 것도 가능합니다.

예제로 바로 확인하겠습니다.

 

트랜잭션을 시작하고,

 

레코드를 삽입했습니다.

 

삽입한 시점에서 save point를 A라는 이름으로 저장하고,

1번 레코드를 삭제한 상황입니다.

 

A로 롤백했더니, 삽입된 부분은 그대로 남아있고, 지워진 것만 취소된 상태 (A에서의 savepoint)로 돌아간 것을 확인할 수 있습니다.

 

물론 그냥 rollback 하면 마지막 commit 된 시점으로 돌아가기 때문에, save point가 의미가 없습니다.


 

트랜잭션 DDL 예외


DDL문 (table조작 및 칼럼 조작)은 transaction의 rollback 대상이 아닙니다.

 

트랜잭션을 시작하고 person_rollback이라는 table을 하나 생성한 모습입니다.

 

테이블이 생성된 것을 확인하고 rollback 처리를 해주었습니다.

 

하지만 table이 사라지지 않은 것을 확인할 수 있습니다.



 

추가


위에서 알아본 DB Transaction은 MySQL에서 직접 관리해주는 부분이었습니다.

보통 Transaction은 비즈니스 로직 실행 중 문제가 생길 경우, 실행 전으로 완전히 복구를 시킨다던가 하는 경우에 사용되겠죠?

 

애플리케이션단에서 문제가 생긴 경우는 이렇게 쉽게 해결이 되겠지만,

만약 SQL Server 자체가 다운되어 버리는 경우는 어떻게 해결해야 할까요?

 

보통 DB 단에서 문제가 생긴 경우 애플리케이션단에서 WAS가 이런 rollback처리를 해준다고 합니다.


 

오늘은 transaction 기본에 대해서 알아보았습니다.

 

'데이터베이스' 카테고리의 다른 글

트랜잭션 ACID  (0) 2021.05.12
모델링 개념  (0) 2021.05.12
MySQL DCL 예제  (0) 2021.04.07
MySQL DDL 예제  (0) 2021.04.07
MySQL Join 기본  (0) 2021.03.31