MySQL ERROR 1412: 트랜잭션 문제와 격리 수준의 이해
MySQL Transaction ERROR 1412와 격리 수준 이해하기
작성자: Lalit Choudhary
게시일: 2024년 12월 20일
안녕하세요, 데이터베이스 관리자(DBA) 및 개발자 여러분! 오늘은 MySQL에서 발생할 수 있는 "ERROR 1412 (HY000): 테이블 정의가 변경되었습니다. 트랜잭션을 다시 시도하십시오." 에러와 특정 격리 수준 설정에 따른 원인에 대해 알아보도록 하겠습니다.
배경
MySQL 문서에 따르면, 이 에러는 "원본 테이블의 임시 사본을 만드는 작업이 이해되며, 임시 사본이 구축되면 원본 테이블이 삭제됩니다."라는 경우에 발생해야 합니다. 즉, 일관된 읽기(consistent read)는 원본 테이블의 임시 사본을 만들고 원본 테이블을 삭제하는 ALTER TABLE 작업에서 제대로 작동하지 않습니다.
핵심 내용:
- "정확히 읽기(Consistent read)"는 트랜잭션의 스냅샷이 생성된 시점 이후에 존재하는 행을 볼 수 없습니다.
- 트랜잭션 내에서 다시 요청할 경우, 새로운 테이블의 행은 트랜잭션 스냅샷이 생성된 시점에 존재하지 않기 때문에 ER_TABLE_DEF_CHANGED 에러가 발생합니다.
검사 예제
다음은 REPEATABLE-READ 격리 수준에서 이 내용을 검증하는 테스트 예제입니다:
SHOW VARIABLES LIKE '%isolation%';
-- 결과: transaction_isolation : REPEATABLE-READ
트랜잭션을 시작하고 테이블에서 데이터를 조회한 후, 다른 세션에서 ALTER TABLE을 실행하였습니다.
-- 세션 1
BEGIN;
SELECT * FROM sbtest2 LIMIT 1;
-- 세션 2
ALTER TABLE sbtest1 MODIFY COLUMN c1 CHAR(10);
세션 1의 쿼리는 ERROR 1412를 발생시키며, 이는 테이블 정의가 변경되었음을 나타냅니다.
다루지 않는 경우
그렇지만, 테이블의 임시 사본을 생성하지 않는 ALTER 작업을 수행할 경우에도 ER_TABLE_DEF_CHANGED 에러가 발생할 수 있습니다. 비록 이는 MySQL 문서와의 충돌일지라도, 이는 다음 예제에서 확인할 수 있습니다.
-- 세션 2에서 ALGORITHM=INSTANT로 열을 추가합니다.
ALTER TABLE sbtest1 ADD COLUMN c1 INT, ALGORITHM=INSTANT;
위 예제에서 HYPOTHETICAL 에러는 여전히 발생할 수 있습니다.
요약
이 오류는 트랜잭션 격리 수준이 REPEATABLE-READ일 때만 발생하며, 이는 해당 트랜잭션에서 처음으로 읽은 시점의 스냅샷을 기준으로 데이터를 읽기 때문입니다. READ COMMITTED 격리 수준에서는 문제의 원인이 제거되며, 각 일관된 읽기는 자신의 새로운 스냅샷을 설정하고 읽습니다.
우리는 또한 이 문제에 관련된 문서에 버그가 보고되었음을 알 수 있습니다. (버그 링크: MySQL Bug #116132)
Percona는 데이터베이스와 애플리케이션을 더 효율적으로 운영할 수 있도록 돕는 오픈 소스 데이터베이스 소프트웨어 및 서비스 회사입니다. 관련된 더 많은 정보는 Percona 웹사이트를 통해 확인하실 수 있습니다.
이번 포스트가 MySQL 트랜잭션 에러와 그 원인에 대해 이해하는 데 도움이 되셨길 바랍니다. 추가적인 질문이 있으시면 언제든지 댓글로 남겨주세요!