rastalion.dev
MYSQL

MySQL 트랜잭션

teinam 2019-06-18updated 09-20 1 MIN

트랜잭션이란?

트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위입니다. SQL(SELECT, INSERT, DELETE, UPDATE)을 이용하여 데이터베이스에 접근하는 것을 의미합니다.

트랜잭션의 4가지 특징

트랜잭션은 ACID 특성을 만족해야 합니다.

Atomicity (원자성)

하나의 논리적인 작업 단위에 하나의 쿼리가 있든 여러 개가 있든 관계없이 전체가 100% 적용되거나 아무것도 적용되지 않아야 합니다. 일부만 적용되는 중간 상태는 허용하지 않습니다 (COMMIT 또는 ROLLBACK).

Consistency (일관성)

트랜잭션의 작업 처리 결과가 항상 일관성 있어야 합니다. 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 처음에 참조한 데이터베이스 상태를 기준으로 진행합니다.

Isolation (독립성)

둘 이상의 트랜잭션이 동시에 실행될 때 하나의 트랜잭션이 다른 트랜잭션의 연산에 끼어들 수 없습니다. 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 그 결과를 참조할 수 없습니다.

Durability (지속성)

트랜잭션이 성공적으로 완료되면 결과가 영구적으로 반영되어야 합니다. 시스템 장애가 발생하더라도 커밋된 데이터는 보존되어야 합니다.

MyISAM과 InnoDB의 트랜잭션 차이

Primary Key가 설정된 테이블에 기존 값 c가 존재할 때 a, b, c를 INSERT하면 c의 Primary Key가 중복되어 오류가 발생합니다.

InnoDB는 트랜잭션을 지원하므로 아무 값도 INSERT되지 않습니다. 반면 MyISAM은 트랜잭션을 지원하지 않아 a, b는 INSERT되고 c만 중복 오류가 발생합니다.

MyISAM에서 트랜잭션처럼 동작하려면 쿼리를 생성할 때부터 예외 처리를 추가해야 합니다. 이런 방식 때문에 MyISAM은 Rollback 처리가 번거롭고 어렵습니다.

NOTE — MyISAM은 MySQL 8.4에서 파티셔닝을 지원하지 않으며 기본 스토리지 엔진이 아닙니다. 새 테이블은 트랜잭션을 지원하는 InnoDB를 권장합니다.

주의사항

트랜잭션은 DBMS의 커넥션과 마찬가지로 꼭 필요한 최소의 코드에만 적용하는 것이 좋습니다. 트랜잭션이 길어질수록 락이 오래 유지되어 동시성이 떨어지고 데드락 가능성이 높아집니다. 프로그램 코드에서 트랜잭션의 범위를 최소화해야 합니다.

Advertisement