: 트랜잭션은 작업의 완전성을 보장해주는 것
: 트랜잭션을 지원하지 않는 MyISAM과 트랜잭션을 지원하는 InnoDB의 처리 방식 차이에 대한 학습
: MyISAM이나 MEMORY 같이 트랜잭션을 지원하지 않는 스토리지 엔진의 테이블은 더 많은 고민거리를 만들어낸다.
1. MySQL에서의 트랜잭션
: 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아님
: 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 반영될거면 되던가, 아니면 말던가함을 보장해주는 것
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);
mysql> INSERT INTO tab_myisam (fdpk) VALUES (1, 2, 3);
mysql> INSERT INTO tab_innodb(fdpk) VALUES (1, 2, 3);
SQL
복사
⇒ 두 INSERT 문장 모두 프라이머리 키 중복 오류로 쿼리가 실패, 두 레이블의 레코드를 조회해보면 MyISAM은 오류가 발생했음에도 1, 2는 INSERT된 상태, 즉 MYISAM 테이블에 INSERT 문장이 실행되면서
차례대로 1과 2를 저장하고 그 다음 3을 저장하려고 하는 순간 이미 3이 존재하기 때문에 실패, 이미 실행된 1,2를 두고 종료, MEMORY 스토리지 엔진도 MyISAM과 동일하게 작동, InnoDB는 쿼리 중 일부라도
오류가 발생하면 전체를 원 상태로 만드는 트랜잭션의 원칙을 지킴, MyISAM에서 발생하는 이런 현상을 부분 업데이트라고 표현하며 이러한 부분 업데이트 현상은 테이블 데이터의 정합성을 맞추는데 상당히
어려운 문제를 만들어 냄
: 이는 애플리케이션 단계에서 코드를 줄임과 동시에 생각할 부분을 줄여줄 수 있다.
2. 주의사항
: 트랜잭션 또한 DBMS의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋음, 즉 프로그램 코드에서 트랜잭션의 범위를 최소화하라는 의미
: 프로그램의 코드가 데이터베이스 커넥션을 가지고 있는 범위와 트랜잭션이 활성화되어있는 프로그램의 범위를 최소화해야 한다는 것
: 이런 것들이 지켜지지 않으면 DBMS 서버가 높은 부하 상태로 빠지거나 위험한 상태에 빠지는 경우가 빈번히 발생