Loading...
MySQL 9.5 Reference Manual 9.5의 17.20.5 InnoDB Error Handling의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
다음 항목들은 InnoDB가 에러를 어떻게 처리하는지 설명합니다. InnoDB는 어떤 경우에는 실패한 SQL 문장만 롤백하고, 다른 경우에는 전체 트랜잭션을 롤백합니다.
tablespace의 파일 공간이 부족해지면, MySQL
Table is full 에러가 발생하고
InnoDB는 해당 SQL 문장을 롤백합니다.
트랜잭션 deadlock이 발생하면,
InnoDB는 전체
transaction을
roll back합니다.
이런 상황에서는 전체 트랜잭션을 다시 시도해야 합니다.
lock 기다림 timeout이 발생하면, InnoDB는 현재 문장(lock을 기다리다가 timeout에 도달한 문장)을 롤백합니다. 전체 트랜잭션을 롤백하도록 하려면, 서버를
--innodb-rollback-on-timeout
옵션을 활성화하여 시작합니다. 기본 동작을 사용하는 경우에는 해당 문장을 다시 시도하고,
--innodb-rollback-on-timeout가
활성화되어 있는 경우에는 전체 트랜잭션을 다시 시도합니다.
deadlock과 lock 기다림 timeout은 부하가 많은 서버에서 정상적으로 발생할 수 있으므로, 애플리케이션은 이러한 상황이 발생할 수 있음을 인지하고 재시도를 통해 처리해야 합니다.
트랜잭션 동안 데이터에 대한 첫 변경 작업과 커밋 사이에 가능한 한 적은 작업만 수행하여, lock이 유지되는 시간을 가능한 최소로 줄이고, lock이 걸리는 행 수도 최소화함으로써 이러한 상황을 덜 발생하게 만들 수 있습니다. 경우에 따라 작업을 서로 다른 트랜잭션으로 분할하는 것이 실용적이고 도움이 될 수 있습니다.
duplicate-key 에러는 문장에 IGNORE 옵션을 지정하지 않은 경우, 해당 SQL 문장을 롤백합니다.
row too long error는 SQL 문장을 롤백합니다.
기타 다른 에러 대부분은 (InnoDB 스토리지 엔진 레이어 위에 있는) MySQL 레이어의 코드에서 감지되며, 해당 SQL 문장을 롤백합니다. 단일 SQL 문장의 롤백에서는 lock이 해제되지 않습니다.
implicit 롤백 동안이나 explicit
ROLLBACK SQL
문장이 실행되는 동안,
SHOW PROCESSLIST는 관련 커넥션의
State 열에 Rolling back을 표시합니다.
17.20.4 Troubleshooting InnoDB Data Dictionary Operations
17.21 InnoDB Limits