내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
목차
4. 어떤 상황에서 데이터베이스에 교착상태가 발생합니까?
5. 데이터베이스 교착 상태에 대한 해결책을 간략하게 설명하십시오.
잠금은 데이터베이스 시스템을 파일 시스템과 구별하는 핵심 기능입니다. 잠금 메커니즘은 공유 리소스에 대한 동시 액세스를 관리하는 데 사용됩니다. 잠금의 특징을 간략하게 소개하기 위해 MySQL 데이터베이스의 InnoDB 엔진을 예로 들어보겠습니다.
트랜잭션 T1이 r행의 공유 잠금을 획득한 경우 다른 트랜잭션 T2는 즉시 r행의 공유 잠금을 획득할 수 있습니다. 이는 읽기가 r행의 데이터를 변경하지 않기 때문입니다. 이러한 상황을 잠금 호환성이라고 합니다.그러나 다른 트랜잭션 T3이 r행에 대한 배타적 잠금을 얻으려면 트랜잭션 T1과 T2가 r행에 대한 공유 잠금을 해제할 때까지 기다려야 합니다.잠금이 호환되지 않음 . 다음 그림은 공유 잠금과 배타적 잠금의 호환성을 보여줍니다. X 잠금은 어떤 잠금과도 호환되지 않지만 S 잠금은 S 잠금과만 호환됩니다. S 잠금과 X 잠금은 모두 행 잠금이며 호환성은 동일한 레코드(행)에 대한 잠금의 호환성을 의미한다는 점에 유의하는 것이 중요합니다.
엑스 | 에스 | |
엑스 | 호환되지 않음 | 호환되지 않음 |
에스 | 호환되지 않음 | 호환 가능 |
잠금 세분성 : InnoDB 스토리지 엔진은 트랜잭션이 행 수준 잠금과 테이블 수준 잠금을 동시에 가질 수 있도록 하는 다중 세분성 잠금을 지원합니다. 다양한 세분성에서 잠금 작업을 지원하기 위해 InnoDB 스토리지 엔진은 의도 잠금이라는 추가 잠금 방법을 지원합니다. 의도 잠금은 잠긴 개체를 여러 수준으로 나눕니다. 의도 잠금은 트랜잭션이 더 세밀하게 잠기기를 원한다는 것을 의미합니다.
InnoDB 스토리지 엔진은 비교적 간단한 의도 잠금 설계를 지원하며 해당 의도 잠금은 테이블 수준 잠금입니다. 주요 설계 목적은 트랜잭션의 다음 행에 대해 요청된 잠금 유형을 표시하는 것입니다. 두 가지 유형의 의도 잠금을 지원합니다.
1. 의도 공유 잠금(IS 잠금), 트랜잭션은 테이블의 특정 행에 대해 공유 잠금을 얻으려고 합니다.
2. 의도 배타적 잠금(IX 잠금), 트랜잭션은 테이블의 특정 행에 대해 배타적 잠금을 얻으려고 합니다.
InnoDB 스토리지 엔진은 행 수준 잠금을 지원하므로 의도 잠금은 실제로 전체 테이블 스캔을 제외한 모든 요청을 차단하지 않습니다. 따라서 테이블 수준 의도 잠금과 행 수준 잠금의 호환성은 다음과 같습니다.
이다 | 9. 구 | 에스 | 엑스 | |
이다 | 호환 가능 | 호환 가능 | 호환 가능 | 호환되지 않음 |
9. 구 | 호환 가능 | 호환 가능 | 호환되지 않음 | 호환되지 않음 |
에스 | 호환 가능 | 호환되지 않음 | 호환 가능 | 호환되지 않음 |
엑스 | 호환되지 않음 | 호환되지 않음 | 호환되지 않음 | 호환되지 않음 |
잠금 알고리즘: InnoDB 스토리지 엔진에는 다음과 같은 세 가지 행 잠금 알고리즘이 있습니다.
1. 레코드 잠금: 단일 행 레코드에 대한 잠금입니다.
2. 갭 잠금: 갭 잠금, 잠금
3. 다음 키 잠금: 갭 잠금+레코드 잠금, 범위를 잠그고 레코드 자체를 잠급니다.
레코드 잠금은 항상 인덱스 레코드를 잠급니다. InnoDB 스토리지 엔진 테이블이 생성될 때 어떤 인덱스로도 설정되지 않은 경우 InnoDB 스토리지 엔진은 잠금을 위해 암시적 기본 키를 사용합니다. Next-Key Lock은 Gap Lock과 Record Lock을 결합한 잠금 알고리즘입니다. Next-Key Lock 알고리즘에서 InnoDB는 행 쿼리에 이 잠금 알고리즘을 사용합니다. Next-Key Lock을 이용한 잠금 기술을 Next-Key Locking이라고 하며, 팬텀 문제(Phantom Problem)를 해결하기 위한 설계는 아닙니다. 이 잠금 기술을 사용하면 잠긴 내용이 단일 값이 아니라 범위로 잠기는데, 이는 Predict Lock을 개선한 것입니다.
교착상태에 대하여 : 교착상태란 두 개 이상의 트랜잭션이 실행 중 자원 경쟁으로 인해 서로 기다리는 현상을 말한다. 외부의 힘이 없으면 일은 앞으로 나아갈 수 없습니다.
잠금 업그레이드 :잠금 에스컬레이션은 현재 잠금의 세분성을 줄이는 것을 의미합니다. 예를 들어 데이터베이스는 테이블의 1,000개 행 잠금을 페이지 잠금으로 업그레이드하거나 페이지 잠금을 테이블 잠금으로 업그레이드할 수 있습니다.
InnoDB 스토리지 엔진에는 잠금 업그레이드 문제가 없습니다. 레코드별로 행 잠금을 생성하지 않기 때문에, 반대로 각 트랜잭션이 접근하는 페이지별로 비트맵 방식으로 잠금을 관리한다. 따라서 트랜잭션이 페이지에서 하나의 레코드를 잠그든 여러 레코드를 잠그든 관계없이 비용은 일반적으로 동일합니다.
InnoDB 스토리지 엔진에는 3개의 행 잠금 알고리즘이 있으며, 갭 잠금(Gap Lock)이 그 중 하나입니다. 간격 잠금은 범위를 잠그는 데 사용되지만 레코드 자체는 잠그지 않습니다. 그 목적은 여러 트랜잭션이 동일한 범위에 레코드를 삽입하여 팬텀 읽기 문제가 발생할 수 없도록 방지하는 것입니다.
InnoDB 행 수준 잠금은 인덱스의 인덱스 항목을 잠그는 방식으로 구현됩니다. InnoDB는 인덱스 조건을 통해 데이터를 검색할 때만 행 수준 잠금을 사용하고, 그렇지 않은 경우 InnoDB는 테이블 잠금을 사용합니다.
테이블의 특정 행이 잠기면 여러 트랜잭션이 서로 다른 인덱스를 사용하여 여러 행을 잠글 수 있습니다. 또한 기본 키 인덱스, 고유 인덱스 또는 일반 인덱스를 사용하든 InnoDB는 행 잠금을 사용하여 데이터를 잠급니다.
교착상태(Deadlock)란 두 개 이상의 트랜잭션이 실행 중 자원 경쟁으로 인해 서로 기다리는 현상을 말한다. 외부의 힘이 없으면 일은 앞으로 나아갈 수 없습니다.다음 표는 교착 상태의 전형적인 상황, 즉 A가 B를 기다리고 B가 A를 기다리는 상황을 보여줍니다. 이 교착 상태 문제를 호출합니다.AB-BA 교착 상태。
시간 | 세션 A | 세션 B |
1 | 시작하다: | |
2 | mysql>SELECT * FROM t 여기서 a = 1은 업데이트를 위해 사용됩니다. ************1.행************ 가:1 1개 행 세트(0.00초) | 시작하다: |
3 | mysql>SELECT * FROM t 여기서 a = 2는 업데이트를 위해 사용됩니다. ************1.행************ 아:2 1개 행 세트(0.00초) | |
4 | mysql>SELECT * FROM t 여기서 a = 2는 업데이트를 위해 사용됩니다. #기다리다 | |
5 | mysql>SELECT * FROM t 여기서 a = 1은 업데이트를 위해 사용됩니다. 오류 1213(40001): 잠금을 시도하는 동안 교착 상태가 발견되었습니다. 트랜잭션을 다시 시작해 보세요. |
교착 상태 문제를 해결하는 가장 간단한 방법은 타임아웃(Time Out)입니다. 즉, 두 트랜잭션이 서로를 기다릴 때 하나의 대기 시간이 설정된 임계값을 초과하면 트랜잭션 중 하나가 롤백되고 다른 대기 중인 트랜잭션이 계속될 수 있습니다.
시간 초과 메커니즘 외에도 현재 데이터베이스에서는 일반적으로 교착 상태 감지를 위해 대기 그래프(wait graph) 방법을 사용합니다. 이는 시간 초과 솔루션보다 교착 상태 감지에 대한 보다 적극적인 접근 방식입니다. 이 접근 방식은 InnoDB 스토리지 엔진에서도 채택됩니다. 대기 그래프에서는 데이터베이스가 다음 두 가지 유형의 정보를 저장해야 합니다.
1. 잠금 정보 목록
2. 거래대기자 명단
위의 연결리스트를 통해 그래프를 구성할 수 있는데, 이 그래프에 루프가 발생하면 교착상태가 발생하여 리소스가 서로를 기다린다는 의미이다. 이는 보다 적극적인 교착 상태 감지 메커니즘입니다. 각 트랜잭션이 잠금을 요청하고 대기할 때 루프가 있는지 확인합니다. 일반적으로 InnoDB 스토리지 엔진은 트랜잭션을 롤백합니다. 실행 취소할 수 있는 양이 가장 적습니다.