반응형
트랜잭션의 성질
Transaction(트랜잭션)의 4가지 성질 (ACID)
- Atomicity(원자성)
- all or nothing
- 트랜잭션의 모든 연산들이 정상 완료되거나 어떠한 연산도 수행되지 않은 상태를 보장
- Consistency(일관성)
- 공적으로 수행된 트랜잭션은 정당한 데이터들이 데이터베이스에 반영되었음을 의미
- DB에서 데이터 변경 시 사전에 설정되어 있는 룰에 맞지 않는 데이터가 들어가는 것을 방지
- Isolation(독립성/고립성)
- 여러 트랜잭션이 동시에 수행 되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 함
- 다수의 세션 또는 유저가 같은 시간에 같은 데이터에 접근하고 처리 중일 때 수행 중인 트랜잭션이 완료 될 때 까지 다른 트랜잭션이 끼어 들지 못하게 함으로써 데이터의 누락이나 잘못된 데이터에 대한 방지
- Durability(지속성)
- 트랜잭션이 성공적으로 완료되어 커밋되었다면, 해당 트랜잭션에 의한 반영된 모든 변경은 향후에 어떤 소프트웨어나 하드웨어 장애가 발생 되더라도 보존되어야 함
5.1.1 MySQL에서의 트랜잭션
Transaction(트랜잭션)
- 작업의 완전성을 보장해 주는 것
- 논리적인 작업 셋을 모두 완벽하게 처리해야함
- 완벽하게 처리하지 못한다면, 원 상태로 복구해야함
- 일부만 적용되는 현상(Partial update)이 발생하지 않아야함
- 쿼리의 개수와 관계없이 논리적인 작업 자체가 100% 또는 0% 적용되야함
- 100% : COMMIT 실행 시
- 0% : ROLLBACK 시
- 스토리지 엔진에 따른 트랜잭션 오류 시, 실행 결과
- MyISAM : 트랜잭션의 오류에도 부분 업데이트 실행 → 데이터 정합성(모순 없이 일치함) 문제
- InnoDB : 트랜잭션에 일부라도 오류 시, 복구
mysql> create table tb_tab_myisam(col int primary key) ENGINE=MyISAM;
mysql> insert into tb_tab_myisam values (3);
mysql> create table tb_tab_innodb(col int primary key) ENGINE=InnoDB;
mysql> insert into tb_tab_innodb values (3);
mysql> insert into tb_tab_myisam values(1),(2),(3);
Error Code: 1062. Duplicate entry '3' for key 'tb_tab_myisam.PRIMARY'
mysql> insert into tb_tab_innodb values(1),(2),(3);
Error Code: 1062. Duplicate entry '3' for key 'tb_tab_innodb.PRIMARY'
-- MyISAM
mysql> select * from tb_tab_myisam;
+-----+
| col |
+-----+
| 1 |
| 2 |
| 3 |
+-----+
-- InnoDB
mysql> select * from tb_tab_innodb;
+-----+
| col |
+-----+
| 3 |
+-----+
5.2.2 주의사항
트랜잭션의 범위는 최소화하라.
- 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.
처리시작 - > **트랜잭션 시작** ->사용자 로그인 여부 확인 -> 사용자 글쓰기 내용 오류 여부 확인 -> 첨부된 파일의 업로드 가능 확장자 및 용량 확인 , 저장 -> **사용자 입력 내용(글 과 첨부파일 정보) 을 DB에 저장** -> 저장 된 내용 조회 및 추가 정보 DB에서 조회 -> 게시물에 대한 알림 메일 발송 -> **메일 발송 이력 DB에 저장** -> **트랜잭션 종료** -> 처리 완료
- 트랜잭션 시작부터 종료까지 직접 DB에 저장하는 행동은 2번 밖에 없음
-
- 사용자 입력 내용 DB 저장, 2) 메일 발송 이력 DB 저장
- 위 2개의 행동에만 트랜잭션을 시작 및 종료하면 문제를 피할 수 있다.
-
- 외부 로직의 문제로 장시간 소요될 경우, 전체적인 처리가 매우 늦어지거나 문제 가능성 높음
- 특히 ,네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제
- DBMS 서버가 높은 부하상태로 빠지거나 위험한 상태로 빠질 가능성 높음
반응형