Study/Real-MySQL

5.1 트랜잭션

hongeeii 2023. 12. 13. 10:11
728x90
반응형

5.1.1 MySql에서의 트랜잭션

트랜잭션 : 작업의 완전성을 보장해 주는 것(논리적인 작업 셋이 모두 적용되거나 모두 적용안되거나)

/*** 트랜잭션 관점에서 InnoDB 테이블과 MyISAM 테이블의 차이 ***/
CREATE TABLE TAB_MYISAM(
    FDPK	int	NOT NULL,
    primary key (FDPK)
) engine=MyISAM;
insert into tab_myisam (fdpk) values (3);

CREATE TABLE TAB_INNODB(
    FDPK	int	NOT NULL,
    primary key (FDPK)
) engine=InnoDB;
insert into tab_innodb (fdpk) values (3);

-- AUTO-COMMIT 활성화
set autocommit=on;

insert into tab_myisam (fdpk) values (1), (2), (3);
-- Error Code: 1062. Duplicate entry '3' for key 'tab_myisam.PRIMARY'	0.016 sec
insert into tab_innodb (fdpk) values (1), (2), (3);
-- Error Code: 1062. Duplicate entry '3' for key 'tab_innodb.PRIMARY'	0.031 sec

image
image

MyISAM은 트랜잭션을 지원하기 않기 때문에 부분 업데이트(Partial Update)가 발생 -> 데이터 정합성을 맞추는데 어려움

5.1.2 주의사항

트랜잭션도 DBMS 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.

예시 로직
  1. 처리시작(커넥션 생성, 트랜잭션 시작)
  2. 로그인 확인
  3. 글쓰기 내용 오류 확인
  4. 업로드 파일 확인 및 저장
  5. 입력 내용 저장
  6. 첨부파일 정보 저장
  7. 저장된 내용을 조회
  8. 게시물 등록에 대한 알림 발송
  9. 알림 발송 이력 저장(트랜잭션 종료(commit), 커넥션 반납)
  10. 처리완료

위 절차에서 좋지 않은 부분

  • 5번 전 까지는 커넥션이 필요없음

    데이터베이스 커넥션 개수는 제한적이어서 커넥션 소유 시간이 길어질수록 여유 커넥션이 줄어듬

  • 8번 작업. 네트워크를 통한 통신 작업은 DBMS 드랜잭션 내에서 제거하는 것이 좋음

    통신을 못하는 상황이 발생하면 웹서버 뿐만 아니라 DBMS서버까지 위험해지는 상황이 발생

  • 5,6 번은 같은 트랙잭션으로 묶고 7번은 단순 조회성이니 트랜잭션을 사용하지 않아도 되고 9번은 성격이 다르니 다른 트랜잭션으로 분리하는 것이 좋음.

변경 로직
  1. 처리시작
  2. 로그인 확인
  3. 글쓰기 내용 오류 확인
  4. 업로드 파일 확인 및 저장 => 커넥션 생성, 트랜잭션 시작
  5. 입력 내용 저장
  6. 첨부파일 정보 저장 => 트랜잭션 종료(commit)
  7. 저장된 내용을 조회
  8. 게시물 등록에 대한 알림 발송 => 트랜잭션 시작
  9. 알림 발송 이력 저장 => 트랜잭션 종료(commit), 커넥션 반납
  10. 처리완료
728x90
반응형