Transaction은 논리적인 작업이 모두 되거나, 혹은 아무것도 되지 않아야 한다는 것을 보장해 준다.
MySQL에서의 트랜잭션
일단 MyISAM은 트랜잭션을 지원하지 않는 특징을 가지고 있고,
InnoDB는 트랜잭션을 지원하는 스토리지 엔진이다.
두 엔진간의 차이를 직접 하기 위해서 테이블을 만들어 준다.
CREATE TABLE tab_myisam (fdpk int not null, primary key (fdpk) ) ENGINE=MyISAM;
CREATE TABLE tab_innodb (fdpk int not null, primary key (fdpk) ) ENGINE=INNODB;
insert into tab_myisam values (3);
insert into tab_innodb values (3);
실험을 위해서 로우도 한개 추가해 준다.
바로 결과를 볼 수 있게 AutoCommit 옵션을 실행시켜주고, 차이를 보자.
SET AutoCommit=ON;
MyISAM에서는 위의 에러처럼 3이 있기 때문에 3을 제외한 모든 insert문이 실행되었다.
InnoDB는 트랜잭션 단위로 묶여있기 때문에 1,2,3 중 없는 값인 1,2도 insert 되지않는다.
MyISAM과 Memory 스토리지 엔진을 사용하면 위처럼 부분 업데이트 ( Partial Update)가 발생하고
데이터의 정합성이 맞지 않게 된다.
+ 예를 들어 회원이 주문을 하면 포인트가 적립이 되는데, 주문 단계에서 실패했지만 포인트는 적립이 되는 그런 문제들이 생길 수 있을 것 같다.
주의사항
트랜잭션도 필요한 최소한의 단위에만 적용하는게 좋다.
다음의 예시 작업에서 어느 곳에 트랜잭션을 한번 생각해보자
1) 처리 시작
=> DB Connection 생성
=> Transaction 시작
2) 사용자 로그인 여부 확인
3) 글 쓴 내용의 유효성 검사
4) 업로드 한 파일 확인
5) 업로드 한 파일 저장
6) 입력 내용 DB에 저장
7) 첨부 파일 정보 DB에 저장
8) 저장된 정보들 조회
9) 게시글 등록 알림 메일 발송
10) 메일 발송 내역 DB에 저장
<= 트랜잭션 종료
<= Connection 반납
11 ) 처리 끝
위의 작업은 Transaction이 시작하고 종료될 때까지 많은 작업들이 사이에 있다.
정답은 뭘까? (물론 더 좋은 답도 있을 수 있음)
- 1번 - 2-3번 안에 연결 생성
- 2번 - 3-4번 안에 연결 생성
- 3번 - 4-5번 안에 연결 생성
- 4번 - 위 중 정답 없음
정답은 4번이다.
물론 선택지 3번처럼 실제적으로 DB가 시작되는 부분부터 하는게 맞지만, 나머지의 작업들을 기다릴 때까지 너무 긴
작업들이 있다. (특히 메일 전송, FTP)
말했던 대로 트랜잭션은 최소한의 작업 단위별로 두는게DBMS 서버의 부하를 줄일 수 있다.
그럼 다시 한번 트랜잭션을 어떻게 나누는지 보자
1) 처리 시작
2) 사용자 로그인 여부 확인
3) 글 쓴 내용의 유효성 검사
4) 업로드 한 파일 확인
5) 업로드 한 파일 저장
=> DB Connection 생성
=> Transaction 시작
6) 입력 내용 DB에 저장
7) 첨부 파일 정보 DB에 저장
<= 트랜잭션 종료
8) 저장된 정보들 조회
9) 게시글 등록 알림 메일 발송
=> Transaction 시작
10) 메일 발송 내역 DB에 저장
<= 트랜잭션 종료
<= Connection 반납
11 ) 처리 끝
업무의 특성상 위처럼 하지 않고 다른 방법을 사용할 수도 있다.
프로그램의 코드가 DB Connection을 가지고 있는 범위와 Transaction이 활성화 되어있는 프로그램의 범위를 최소화하는게 중요하다는 것이다.
'DataBase > MySQL' 카테고리의 다른 글
MySQL - MySQL 엔진의 잠금. Lock (0) | 2023.03.02 |
---|