MySQL에서 Rollback이 적용되지 않는 케이스에 대해
경위
- 수년전에 만들어진 사내용 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로 설정하는게 좋지않을까생각했음.