해당 글은 Real MySQL 8.0 책을 보고 요약한 내용입니다.
5.1 트랜잭션
트랜잭션을 지원하지 않는 MyISAM과 트랜잭션을 지원하는 InnoDB의 처리 방식 차이를 살펴보자
5.1.1 MySQL에서의 트랜잭션
트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념이 아님.
하나의 논리적인 작업 셋에 쿼리의 갯수와 상관없이 논리적인 작업 셋 자체가 100% COMMIT 되거나 오류가 있을 때 ROLLBACK 되는 것을 보장해주는 것.
MyISAM 엔진 환경 구성
CREATE TABLE tab_myisam (
fdpk INT NOT NULL,
PRIMARY KEY (fdpk)
) ENGINE=MyISAM;
INSERT INTO tab_myisam (fdpk) VALUES (3);
MyISAM 엔진 쿼리 실행
real_mysql_test> INSERT INTO tab_myisam VALUES (1), (2), (3)
[2021-11-22 22:27:10] [23000][1062] Duplicate entry '3' for key 'tab_myisam.PRIMARY'
MyISAM 엔진 결과
SELECT * FROM tab_myisam;
InnoDB 엔진 환경 구성
CREATE TABLE tab_innodb (
fdpk INT NOT NULL,
PRIMARY KEY (fdpk)
) ENGINE=INNODB;
INSERT INTO tab_innodb (fdpk) VALUES (3);
InnoDB 엔진 쿼리 실행
real_mysql_test> INSERT INTO tab_innodb VALUES (1), (2), (3)
[2021-11-22 22:31:16] [23000][1062] Duplicate entry '3' for key 'tab_innodb.PRIMARY'
InnoDB 엔진 결과
SELECT * FROM tab_innodb;
두 엔진 모두 Primary Key 중복 오류로 쿼리가 실패.
MyISAM 엔진은 오류에도 불구하고 '1'과 '2'가 삽입 됨, InnoDB 엔진은 트랜잭션의 원칙대로 원 상태로 ROLLBACK.
"MyISAM 처럼 트랜잭션을 지원하지 않으면 테이블 데이터의 정합성을 맞추는데 상당히 어려운 문제를 만듬."
5.1.2 주의사항
트랜잭션 또한 DBMS의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋음. (프로그램 코드에서 트랜잭션의 범위를 최소화하라는 의미.)
- 데이터베이스 커넥션을 가지고 있는 범위와 트랜잭션이 활성화돼 있는 프로그램의 범위를 최소화
- 네트워크크 작업이 있는 경우 반드시 트랜잭션에서 배제
'Book & Lecture > Real MySQL 8.0' 카테고리의 다른 글
5.4 MySQL의 격리 수준 (0) | 2021.12.01 |
---|---|
5.3 InnoDB 스토리지 엔진 잠금 (0) | 2021.11.28 |
5.2 MySQL 엔진의 잠금 (0) | 2021.11.24 |
5. 트랜잭션과 잠금 (0) | 2021.11.22 |
0. 실습환경 (0) | 2021.11.22 |