트랜잭션은 작업의 완전성을 보장해주는 것이다.
즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않게 만들어주는 기능이다.
잠금은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다.
- 잠금 - 여러 커넥션에서 동시에 동일한 자원(레코드 or 테이블)을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 함.
- 격리 수준 - 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지를 결정하는 레벨을 의미.
5.1 트랜잭션
트랜잭션을 지원하지 않는 MyISAM과 트랜잭션을 지원하는 InnoDB의 처리 방식 차이를 살펴보자.
5.1.1 MySQL에서의 트랜잭션
트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다.
- 트랜잭션 - 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야(ROLLBACK 또는 트랜잭션을 ROLLBACK 시키는 오류가 발생했을 때) 함을 보장해 주는 것.
CREATE TABLE tab_myisam (fpdk INT NOT NULL, PRIMARY KEY (fpdk)) ENGINE=MyISAM;
INSERT INTO tab_myisam (fdpk) VALUES (3);
CREATE TABLE tab_innodb (fpdk INT NOT NULL, PRIMARY KEY (fpdk)) ENGINE=INNODB;
INSERT INTO tab_innodb (fdpk) VALUES (3);
SET autocommit=ON;
INSERT INTO tab_myisam (fpdk) VALUES (1),(2),(3);
INSERT INTO tab_innodb (fpdk) VALUES (1),(2),(3);
위 두 개의 스토리지 엔진에서 결과가 어떻게 다를까?
두 INSERT 문장 모두 프라이머리 키 중복 오류로 쿼리가 실패한다. 그런데 두 테이블의 레코드를 조회해보면 MyISAM 테이블에는 오류가 발생했음에도 ‘1’과 ‘2’는 INSERT된 상태로 남아 있는 것을 확인할 수 있다.
즉, MyISAM 테이블에 INSERT 문장이 실행되면서 차례대로 ‘1’, ‘2’를 저장하고, 그다음 ‘3’을 저장하려고 하는 순간 중복키 오류가 발생한 것이다.
하지만 MyISAM 테이블에서 실행되는 쿼리는 이미 INSERT된 ‘1’,’2’를 그대로 두고 쿼리 실행을 종료해 버린다.
InnoDB는 쿼리 중 일부라도 오류가 발생하면 전체를 원 상태로 만든다는 트랜잭션의 원칙대로 INSERT 문장을 실행하기 전 상태로 그대로 복구한다.
MyISAM 테이블에서 발생하는 이상 현상을 부분 업데이트(Partial Update)라고 표현하며, 부분 업데이트 현상은 테이블 데이터의 정합성을 맞추는데 상당히 어려운 문제를 만든다.
- 트랜잭션이란 애플리케이션 개발에서 고민해야 할 문제를 줄여주는 아주 필수적인 DBMS의 기능이라는 점을 기억하자!
- 부분 업데이트 현상이 발생하면 남은 레코드를 다시 삭제하는 재처리 작업이 필요할 수 있는데 InnoDB를 사용하면 IF ... ELSE ... 로 가득한 코드를 깔끔하게 처리할 수 있다.
5.1.2 주의사항
트랜잭션 또한 DBMS의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.
- 이는 프로그램 코드에서 트랜잭션의 범위를 최소화하라는 의미!
1) 처리 시작
=> 데이터베이스 커넥션 생성
=> 트랜잭션 시작
2) 사용자의 로그인 여부 확인
3) 사용자의 글쓰기 내용의 오류 여부 확인
4) 첨부로 업로드된 파일 확인 및 저장
5) 사용자의 입력 내용을 DBMS에 저장
6) 첨부 파일 정보를 DBMS에 저장
7) 저장된 내용 또는 기타 정보를 DBMS에서 조회
8) 게시물 등록에 대한 알림 메일 발송
9) 알림 메일 발송 이력을 DBMS에 저장
<= 트랜잭션 종료(COMMIT)
<= 데이터베이스 커넥션 반납
10) 처리 완료
위 처리 절차 중에서 DBMS의 트랜잭션 처리에 좋지 않은 영향을 미치는 부분을 나눠서 살펴보자.