14.19.4 InnoDB 오류 처리
InnoDB
에서의 오류 처리는 SQL 표준에 지정된 것과 반드시 같지는 않습니다. 이 표준에 따르면, SQL 문 중 오류가 발생하면 반드시 그 문 롤백을 실행해야합니다. InnoDB
는 경우에 따라 문 일부만 또는 전체 트랜잭션을 롤백합니다. 다음의 각 항목은 InnoDB
가 오류 처리를 어떻게 실행하는지 설명하고 있습니다.
테이블 공간 의 파일 공간이 부족하면 MySQL의
Table is full
오류가 발생하고InnoDB
는 SQL 문을 롤백합니다.트랜잭션 교착 상태 가 발생하면
InnoDB
는 트랜잭션 전체를 롤백 합니다. 이것이 발생하면 전체 트랜잭션을 다시 시도합니다.잠금 대기 시간 초과가 발생하면
InnoDB
는 잠금 대기 중 시간이 초과 한 1 개의 문만 롤백합니다. (전체 트랜잭션이 롤백되도록하려면--innodb_rollback_on_timeout
옵션을 사용하여 서버를 시작합니다.) 현재 동작을 사용하는 경우는 그 문을--innodb_rollback_on_timeout
를 사용하여 있다면 전체 트랜잭션을 다시 시도합니다.교착 상태 및 잠금 대기 시간은 모두 바쁜 서버에서는 정상적인 것이며, 응용 프로그램은 그 발생 가능성을 인식하고 발생한 경우 시도에서 처리해야합니다. 트랜잭션의 첫번째 데이터 변경에서 커밋 사이에 할 작업을 최소화하여 잠금이 가능한 최단 시간 가능성있는 가장 작은 행수에 유지되도록함으로써 그들이 발생 가능성을 줄일 수 있습니다. 경우에 따라서는 다른 트랜잭션 사이에 작업의 분할이 실제적으로하고 도움이 될 수 있습니다.
교착 상태 또는 잠금 대기 시간 초과로 인해 트랜잭션 롤백이 발생하면 그 트랜잭션의 문 효과가 취소됩니다. 그러나 트랜잭션 시작 문이
START TRANSACTION
또는BEGIN
문이면 명령문이 롤백 의해 취소되지 않습니다. 그 이상의 SQL 문은COMMIT
,ROLLBACK
또는 암시 적 커밋을 발생시키는 어떤 SQL 문이 나타날 때까지 해당 트랜잭션의 일부입니다.문
IGNORE
옵션을 지정하지 않은 경우 중복 키 오류는 SQL 문을 롤백합니다.row too long error
는 SQL 문을 롤백합니다.다른 오류는 대부분 (
InnoDB
스토리지 엔진 레벨 위에있는) 코드의 MySQL 레이어에 의해 검출 된 해당 SQL 문을 롤백합니다. 하나의 SQL 문 롤백에서는 잠금이 해제되지 않습니다.
암시 적 롤백 중이나 명시적인 ROLLBACK
SQL 문 실행 중에 SHOW PROCESSLIST
관련 연결 State
컬럼에 Rolling back
을 표시합니다.