DataBase/MySQL

MySQL - Transaction의 간략한 설명 및 작업 단위 나누기

비뀨_ 2023. 3. 2. 02:11

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

MyISAM에서는 위의 에러처럼 3이 있기 때문에 3을 제외한 모든 insert문이 실행되었다.

InnoDB

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