본문 바로가기
개발/Database

MySQL에서 Rollback이 적용되지 않는 케이스에 대해

by ispie 2019. 1. 28.

경위

  • 수년전에 만들어진 사내용 DB가 존재하는데 이번에 DB를 사용하는 새로운 서브 시스템을 개발하게 되었습니다.
  • 해당 DB는 기존에 있는 사내 시스템을 위해 구축된 녀석으로 이녀석에게 내가 할 수 있는건 SELECT/INSERT/UPDATE밖에 없습니다.(=DB설정을 바꿀 수 는 없는 상황)
  • 서브 시스템은 데이터 연계용으로서 당연히(?) 트랜잭션 처리로 커밋과 롤백을 제어하고 싶습니다.


근데 아래와 같은 에러 메세지가 표시 되면서 MySQL에서 롤백 처리가 안되는 겁니다…;

1196 Some non-transactional changed tables couldn't be rolled back

 


원인


내가 보고 있는 테이블은 트랜잭션이 적용되지 않는 MyISAM 테이블이었기 때문에 롤백 처리를 지원하지 않았습니다.

 

해당 테이블의 DB엔진 확인

SHOW TABLE STATUS LIKE 'table_name';

 

해당 테이블의 DB엔진 확인(스키마 단위)

SELECT TABLE_NAME,
 ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'schema_name' and ENGINE = 'myISAM'

 

MyISAM Engin

 

 


InnoDB Engin(트랜잭션 가능)

 

 

 

정리

  • 개발시에는 주로 InnoDB를 사용했고 MyISAM를 의식해서 사용한 적이 없어서 조금 당황 했습니다.
  • 결국 이번 케이스의 경우엔 DB의 트랜잭션 처리는 불가능 하기 때문에 어플에서 제어하도록 대응했습니다.
  • 둘다 장단점이 있고 이번 것은 특히 리포트 표시를 중심으로 한 정적인 면이 큰(?) 시스템의 DB라 MyISAM를 채택한 듯 하나, 차후 서브 시스템이 붙어서 거기선 트랜잭션 제어를 하고 싶어지면 곤란하므로 가급적 처음부터 InnoDB로 설정하는게 좋지않을까 하고 생각했습니다.

 

 

댓글