MyISAM은 트랜잭션을 지원하지 않습니다.
INSERT INTO tab_a ....;
IF(_is_insert1_succeed){
INSERT INTO tab_b ....;
IF(_is_insert2_succeed){
// 처리 완료;
}ELSE{
DELETE FROM tab_a WHERE......;
IF(_is_delete_succeed){
//처리 실패 및 tab_a. tab_b 모두 원상 복구 완료
}ELSE{
// 해결 불가능한 심각한 상황 발생
// 이제 어떻게 해야 하나?
// tab_b에 INSERT는 안 되고, 하지만 tab_a에는 INSERT돼 버렸는데, 삭제는 안 되고...
}
}
}
코드가 장난처럼 작성한 코드 같지만 트랜잭션이 지원되지 않는 MyISAM에 레코드를 INSERT할 때 위와 같이 하지 않으면 방법이 없습니다. 코드를 이렇게 작성하지 않았다면 부분 업데이트의 결과로 쓰레기 데이터가 테이블에 남아 있을 가능성이 있습니다. 하지만 위의 코드를 트랜잭션이 지원되는 InnoDB 테이블에서 처리한다고 가정하면 다음과 같은 간단한 코드로 완벽한 구현이 가능합니다. 얼마나 깜끔한 코드로 바뀌었는가. 비즈니스 로직 처리로 이미 IF....ELSE... 로 가득한 프로그램 코드에 이런 데이터 클렌징 코드까지 넣어야 한다는 것은 정말 힘듭니다.
try{
START TRANSACTION;
INSERT INTO tab_a ....;
INSERT INTO tab_b.....;
COMMIT;
} catch(exception){
ROLLBACK;
}
'스터디 > MySQL' 카테고리의 다른 글
InnoDB 스토리지 엔진 잠금 (0) | 2023.03.22 |
---|---|
MySQL 엔진의 잠금 (0) | 2023.03.21 |
트랜잭션 지원 메타데이터 (0) | 2023.02.12 |
쿼리 실행 구조 (0) | 2023.01.29 |
플러그인 스토리지 엔진 모델 (0) | 2023.01.29 |