이번 글은 트랜잭션과 잠금에 대해서 알아보도록 하겠습니다.
트랜잭션
트랜잭션은 하나의 논리적인 작업이 100% 적용(commit)이 되거나 100% 적용이 되지 않아야 함(rollback)을 보장해주는 것입니다.
트랜잭션은 작업의 일부만 진행되는 현상(Partial update)를 발생하지 않게 만들어주어 작업의 완정성을 보장해 줍니다.
추가로, MySQL 서버에서 트랜잭션을 지원하는 엔진은 InnoDB 스토리지 엔진입니다. MyISAM과 MEMORY는 트랜잭션을 지원하지 않습니다.
MySQL에서 트랜잭션
트랜잭션은 논리적인 작업 셋 자체가 100% 적용(COMMIT)되거나 아무것도 적용되지 않음(ROLLBACK)을 보장해 줍니다.
InnoDB 테이블과 MyISAM 테이블 차이를 알아보기 위해 아래 코드를 적용시킵니다.
mysql> CREATE TABLE tab_myisam (fdpk INT NOT NULL, PRIMARY KEY (fdpk)) ENGINE=MyISAM;
mysql> INSERT INTO tab_myisam (fdpk) VALUES (3);
mysql> CREATE TABLE tab_innodb (fdpk INT NOT NULL, PRIMARY KEY (fdpk)) ENGINE=INNODB;
mysql> INSERT INTO tab_innodb (fdpk) VALUES (3);
테이블에 레코드 1건 저장 및 AUTO-COMMIT 모드에서 쿼리 실행하면 어떻게 될까요?
먼저 테이블을 생성하고 각 테이블에 레코드 1건을 저장합니다.
mysql> SET autocommit=ON;
mysql> INSERT INTO tab_myisam (fdpk) VALUES (1),(2),(3);
mysql> INSERT INTO tab_innodb (fdpk) VALUES (1),(2),(3);
쿼리 문장을 MySQL을 통해 테스트 해보면 결과는 다음과 같습니다.
MyISAM을 먼저 보도록 하겠습니다.
InnoDB인 경우는 다음과 같습니다.
두 테이블(MyISAM과 InnoDB)은 동일한 상황에서 서로 다른 방식으로 동작합니다. 예를 들어, 기본키 중복 오류로 인해 쿼리가 실패한 경우를 살펴보겠습니다.
먼저, MyISAM 테이블에서는 쿼리가 실패하더라도 이미 삽입된 값은 그대로 남아 있습니다. 예를 들어, 1과 2가 INSERT된 상태로 테이블에 유지됩니다. 이는 MyISAM이 트랜잭션을 지원하지 않기 때문에 발생하는 현상입니다. 참고로, MEMORY 스토리지 엔진도 MyISAM과 동일한 방식으로 동작합니다.
반면, InnoDB 테이블은 다르게 작동합니다. 동일한 상황에서 쿼리가 실패하면, InnoDB는 이미 삽입된 값인 1과 2를 취소합니다. 이는 InnoDB가 트랜잭션을 지원하기 때문입니다. 트랜잭션 덕분에 중간에 오류가 발생해도 전체 작업을 원래 상태로 복구할 수 있습니다.
그렇다면, 이런 차이는 왜 발생할까요? 핵심은 바로 트랜잭션 지원 여부입니다.
트랜잭션은 데이터의 정합성을 유지하는 데 중요한 역할을 합니다. MyISAM에서는 트랜잭션을 지원하지 않기 때문에, 쿼리 중간에 실패가 발생하면 데이터가 부분적으로 업데이트된 상태로 남아 있게 됩니다. 이를 "부분 업데이트 현상"이라고 합니다. 이러한 상태는 데이터 정합성을 유지하기 어렵게 만들고, 이후에 발생하는 문제를 해결하려면 남아 있는 잘못된 레코드를 삭제하거나 다시 수정해야 합니다.
InnoDB는 이와 같은 문제를 해결합니다. 트랜잭션은 실패한 작업 전체를 자동으로 복구하기 때문에, "부분 업데이트 현상"을 원천적으로 차단할 수 있습니다. 만약 쿼리가 수백만 건에 이른다면, 트랜잭션 없이 수동으로 데이터를 복구하는 작업은 너무나 비효율적일 것입니다. InnoDB는 이를 자동으로 처리함으로써 개발자의 부담을 줄이고, 데이터 정합성을 보장합니다.
결국, MyISAM과 InnoDB의 가장 큰 차이는 트랜잭션 지원 여부입니다. 이 차이는 데이터 정합성을 유지하는 데 큰 영향을 미칩니다. 특히, 트랜잭션이 없다면 발생할 수 있는 "부분 업데이트 현상"은 데이터베이스 설계와 운영에 있어 중요한 고려 사항이 될 것입니다.
// 코드적으로 접근하는 방법 이어서 하기
'Mysql' 카테고리의 다른 글
커버링 인덱스 & 성능 테스트 (0) | 2025.01.30 |
---|---|
Index와 Query문 조건의 관계 (0) | 2025.01.28 |