• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 1. InnoDB 소개
    2. InnoDB의 개념과 아키텍처
    1. MySQL 과 ACID 모델
    2. InnoDB 트랜잭션 모델 및 잠금
    3. InnoDB 잠금 모드
    4. 일관성 nonlock 읽기
    5. 잠금 읽기 (SELECT ... FOR UPDATE 및 SELECT ... LOCK IN SHARE MODE)
    6. InnoDB 레코드 격차 및 넥스트 키 잠금
    7. 넥스트키 로크에 의한 팬텀 문제 해결
    8. InnoDB의 다양한 SQL문에서 설정된 잠금
    9. 암시적 트랜잭션 커밋과 롤백
    10. 교착 상태 감지 및 롤백
    11. 교착 상태 해결 방법
    12. InnoDB 멀티 버전
    13. InnoDB 테이블 및 인덱스 구조
    3. InnoDB 구성
    4. InnoDB 관리
    5. InnoDB 테이블 스페이스 관리
    6. InnoDB 테이블 관리
    7. InnoDB 압축 테이블
    8. InnoDB 파일 형식 관리
    9. InnoDB Row Storage and Row Formats
    10. InnoDB 디스크 I/O 및 파일 영역 관리
    11. InnoDB와 온라인 DDL
    12. InnoDB 부팅 옵션 및 시스템 변수
    13. InnoDB의 성능
    14. InnoDB INFORMATION_SCHEMA 테이블
    15. InnoDB 모니터
    16. InnoDB 백업 및 복구
    17. InnoDB와 MySQL 복제
    18. InnoDB 및 memcached의 통합
    19. InnoDB 문제 해결
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

14.2.11 교착 상태의 해결 방법

이 섹션은 섹션 14.2.10 "교착 상태 감지 및 롤백" 에 나타낸 교착 상태에 대한 개념 정보를 기반으로합니다. 여기에서는 교착 상태가 최소화되도록 데이터베이스 작업을 구성하는 방법 및 응용 프로그램에 필요한 후속 오류 처리에 대해 설명합니다.

교착 상태 는 트랜잭션 데이터베이스의 고전적인 문제이지만, 특정 트랜잭션을 전혀 수행 할 수 없을 정도로 발생 빈도가 높아야 위험하지 않습니다. 일반적으로 교착 상태가 발생하여 트랜잭션이 롤백 된 경우 그것을 다시 발행 할 준비가 항상되어있는 것처럼 응용 프로그램을 작성해야합니다.

InnoDB 는 자동 행 레벨 잠금이 사용됩니다. 단일 행을 삽입하거나 삭제하는 경우 트랜잭션의 경우 교착 상태가 발생할 수 있습니다. 그 원인은 이러한 작업이 실제로는 "원자 적"이 없기 때문입니다. 이러한 작업은 자동으로 삽입 또는 삭제 된 행의 인덱스 레코드 (수 있음)에 잠금이 설정됩니다.

다음의 방법을 사용하면 교착 상태를 해결하고 발생 가능성을 줄일 수 있습니다.

  • 언제든지 SHOW ENGINE INNODB STATUS 명령을 실행하여 최근 교착 상태의 원인을 확인하십시오. 이것은 교착 상태가 해결되도록 응용 프로그램을 조정하는 데 도움이됩니다.

  • 자주 교착 상태 경고가 발생할 수 우려가있는 경우 innodb_print_all_deadlocks 구성 옵션을 사용하여 더 광범위한 디버그 정보를 수집합니다. MySQL의 오류 로그 는 최근 교착 상태뿐만 아니라 각 교착 상태에 대한 정보가 기록됩니다. 디버깅이 완료되면이 옵션을 비활성화합니다.

  • 교착 상태로 인해 트랜잭션이 실패했을 경우에 해당 트랜잭션을 다시 발행 할 수 있도록 항상 준비하고 있어야합니다. 교착 상태는 위험하지 않습니다. 다시 시도하십시오.

  • 트랜잭션이 충돌 할 가능성을 줄이기 위해 트랜잭션의 크기를 작게 기간을 짧게 유지하십시오.

  • 트랜잭션이 충돌 할 가능성을 낮게하기 위해 관련된 일련의 변경을 행한 직후에 트랜잭션을 커밋합니다. 특히 커밋되지 않은 트랜잭션을 포함 인터랙티브 mysql 세션은 장시간 열어 두지 마십시오.

  • 잠금 읽기 ( SELECT ... FOR UPDATE 또는 SELECT ... LOCK IN SHARE MODE )를 사용하는 경우, READ COMMITTED 등의 낮은 격리 수준을 사용하여보십시오.

  • 트랜잭션에서 여러 테이블을 변경하거나 같은 테이블의 다른 행 세트를 변경하는 경우 매번 이러한 작업을 일관성있는 순서대로 수행하십시오. 그 결과 거래에서 명시 적으로 정의 된 큐가 생성되고 교착 상태가 발생하지 않습니다. 예를 들어, 다양한 장소에서 같은 INSERT , UPDATE 및 DELETE 문 시퀀스를 여러 번 코딩하는 것이 아니라 데이터베이스 작업을 응용 프로그램의 함수로 구성하고, 스토어드 루틴을 호출하기도합니다.

  • 테이블에 적절한 인덱스를 추가하십시오. 이렇게하면 쿼리에서 검색해야하는 인덱스 레코드 수가 감소하기 때문에 잠금 설정도 감소합니다. MySQL 서버가 쿼리에 적합하다고 간주 인덱스를 특정하기 위해 EXPLAIN SELECT 를 사용하십시오.

  • 락의 사용을 줄이십시오. 오래된 스냅 샷에서 데이터를 반환하기 위해 SELECT 를 허용 할 여유가 있다면, FOR UPDATE 또는 LOCK IN SHARE MODE 절을 추가하지 마십시오. 동일한 트랜잭션 내의 각 일관성 독해는 자신의 새로운 스냅 샷에서 읽기 때문에 READ COMMITTED 격리 수준을 사용하는 것이 적절한 방법입니다.

  • 다른 방법이 없으면 테이블 수준 잠금을 사용하여 트랜잭션을 직렬화하십시오. InnoDB 테이블 등의 트랜잭션 테이블에 LOCK TABLES 을 사용하는 올바른 방법은 ( START TRANSACTION 대신) SET autocommit = 0 에서 트랜잭션을 시작하고 그 후 LOCK TABLES 를 실행하여 UNLOCK TABLES 를 호출하기 전에 트랜잭션을 명시 으로 위탁하는 것입니다. 예를 들어, 테이블 t1 에 쓰기 테이블 t2 에서 읽을 필요가있는 경우는 다음과 같이 실행할 수 있습니다.

     SET autocommit = 0;
     LOCK TABLES t1 WRITE, t2 READ ...;
    ... do something with tables t1 and t2 here ...
     COMMIT;
     UNLOCK TABLES;
    

    테이블 수준 잠금을 사용하면 테이블에 대한 병렬 업데이트가 억제되기 때문에 교착 상태가 해결되지만 사용량이 많은 시스템에서 응답 성이 낮아지는 희생이 따릅니다.

  • 트랜잭션을 직렬화하는 또 다른 방법은 단일 행만을 포함한 보조 "세마포어"테이블을 작성하는 것입니다. 다른 테이블에 액세스하기 전에 각 트랜잭션에서 행을 업데이트하십시오. 이렇게하면 모든 트랜잭션이 직렬 방식으로 발생합니다. 직렬화 잠금은 행 레벨 잠금이기 때문에이 경우 InnoDB 인스턴트 교착 상태 탐지 알고리즘도 기능한다는 점에 유의하십시오. MySQL의 테이블 레벨 잠금을 사용하여 교착 상태를 해결하려면 시간 제한 방식을 사용해야합니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved