Mysql 격 리 성 Read View 의 용법 설명

4426 단어 Mysql격 리ReadView
현재 트 랜 잭 션 은 어떤 역사 버 전 을 읽 을 수 있 습 니까?
Read View 는 트 랜 잭 션 이 열 렸 을 때 현재 모든 트 랜 잭 션 의 집합 입 니 다.이 데이터 구 조 는 현재 Read View 에서 가장 큰 ID 와 가장 작은 ID 를 저장 합 니 다.
이것 이 현재 활성 화 된 트 랜 잭 션 목록 입 니 다.다음 과 같 습 니 다.

ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3;
ct-trx 는 현재 업무 의 id 를 표시 하고 위의 read 에 대응 합 니 다.view 데이터 구 조 는 다음 과 같 습 니 다.

read_view->creator_trx_id = ct-trx;
read_view->up_limit_id = trx3;    
read_view->low_limit_id = trx11;    
read_view->trx_ids = [trx11, trx9, trx6, trx5, trx3];
low_limit_id 는'높 은 수위',즉 그 당시 활발 한 업무 의 최대 id 입 니 다.row 의 db 를 읽 으 면trx_id>=low_limit_id,이 id 가 이전에 제출 되 지 않 았 음 을 설명 합 니 다.주석 에 있 는 설명 과 같이 이 데 이 터 는 보이 지 않 습 니 다.

if (trx_id >= view->low_limit_id) {
return(FALSE);
}
주:readview 부분 원본 코드
up_limit_id 는"저수 위",즉 당시 활성 화 된 트 랜 잭 션 목록 의 최소 트 랜 잭 션 id 입 니 다.만약 row 의 dbtrx_id if (trx_id < view->up_limit_id) { return(TRUE); } row 의 dbtrx_id 는 lowlimit_id 와 uplimit_id 사이 에 이 기록 의 db 를 찾 습 니 다.trx_id 자신의 일 에 있 는 readview->trx_ids 목록 에 있 으 면 이 기록 의 현재 버 전 을 볼 수 없습니다.그렇지 않 으 면 이 기록 의 현재 버 전 을 볼 수 있 습 니 다.
격 리 단계 별 ReadView 구현 방식
1. read-commited:

즉,문장 이 실 행 될 때마다 read 를 닫 습 니 다.view,다시 rowsearch_for_my sql 함수 에서 현재 read 생 성view。이렇게 하면 중복 읽 을 수 없 는 현상 이 발생 할 것 이다.
2. repeatable read:
repeatable read 의 격 리 단계 에서 트 랜 잭 션 trx 구 조 를 만 들 때 현재 global read view 가 생 성 됩 니 다.trx 사용assign_read_view 함수 생 성,트 랜 잭 션 이 끝 날 때 까지 유 지 됩 니 다.트 랜 잭 션 이 끝 난 동안 매번 조회 할 때마다 read View 를 재 구축 하지 않 아 중복 읽 기 가 가능 합 니 다.
mysql 의 mvcc 와 readview
격 리 단계 표준 정의:
read uncommited 한 사 무 는 다른 업무 가 제출 하지 않 은 결 과 를 읽 었 습 니 다.
read committed 한 사무 a 는 다른 사무 b 가 최근 에 제출 한 결 과 를 읽 어서 사무 a 가 두 번 읽 은 결과 가 다 르 게 합 니 다.더러 운 읽 기 를 피 할 수 있 고 중복 읽 기,환 독 이 발생 할 수 있 습 니 다.버 전 체인(mvcc)과 readview 를 통 해 이 루어 집 니 다.
repeatable read(my sql 의 기본 격 리 단계)한 사무 가 처음으로 어떤 기록 을 읽 은 후에 다른 사무 가 이 기록 을 제출 한 후에 사무 a 가 읽 은 것 은 첫 번 째 값 입 니 다.이것 은 반복 적 으로 읽 을 수 있 는 것 입 니 다.같은 사무 에서 같은 데 이 터 를 여러 번 읽 고 되 돌아 온 결 과 는 같 습 니 다.트 랜 잭 션 은 기 존 데이터 에 대한 다른 트 랜 잭 션 의 수정 을 읽 지 않 습 니 다.다른 트 랜 잭 션 이 제출 되 었 더 라 도 트 랜 잭 션 이 시 작 될 때 읽 은 기 존 데이터 가 무엇 인지,트 랜 잭 션 이 제출 되 기 전 임의의 시간 에 이 데이터 의 값 은 같 습 니 다.그러나 다른 사무 에 새로 삽 입 된 데 이 터 는 읽 을 수 있 고 이 는 환 독 문 제 를 일 으 켰 다.더러 운 읽 기와 중복 읽 을 수 없 는 문 제 를 피 했 지만 환 독 은 여전히 존재 한다.또한 환 독 이 발생 할 수 있 습 니 다.(그러나 my sql 은 환 독 문 제 를 해결 하 였 습 니 다)버 전 체인 과 readview 를 통 해 이 루어 집 니 다.
serializable 은 같은 줄 에 기 록 된 읽 기와 쓰기 의 병행 작업 을 허용 하지 않 으 며,반드시 직렬 로 실행 해 야 하기 때문에 환 독,더러 운 읽 기 현상 이 나타 나 지 않 습 니 다.
my sql 에서 읽 기 제출 및 중복 읽 기 가능 한 트 랜 잭 션 격 리 단 계 는 mvcc 와 readview 를 통 해 이 루어 집 니 다.
화면 음악 cc 즉 Multi-Version Concurrency Control,다 중 버 전 병행 제어,하나의 데이터 의 여러 버 전 을 유지 하여 업무 간 의 읽 기와 쓰기 가 격 리 단계 에 따라 해당 하 는 결 과 를 얻 고 충돌 이 발생 하지 않도록 합 니 다.

격 리 단계 read committed 에 대해 매번 새로운 readview 를 생 성 합 니 다.
격 리 단계 repeatable read 에 대해 서 는 트 랜 잭 션 이 시 작 될 때 만 readview 를 생 성 합 니 다.트 랜 잭 션 이 제출 될 때 까지 변화 가 없 기 때문에 중복 읽 을 수 있 습 니 다.
readview 생 성 시
m_ids:활성 화 된 트 랜 잭 션 id 목록 표시
min_trx_id:활성 화 된 트 랜 잭 션 의 최소 트 랜 잭 션 id
max_trx_id:생 성 된 최대 트 랜 잭 션 id
creator_trx_id:현재 트 랜 잭 션 id
현재 업무 에 있어 서 다음 규칙 에 따라 최신 버 전부터 옮 겨 다 니 며 해당 하 는 버 전 기록 을 가 져 옵 니 다.
1.방 문 된 trxid 와 readview 의 creatortrx_id 와 같 습 니 다.현재 업무 가 자신 이 수정 한 기록 에 접근 하고 있 음 을 나타 냅 니 다.이 를 통 해 알 수 있 고 되 돌아 갑 니 다.
2,방문 한 trxid 작은 mintrx_id,이 버 전이 제출 되 었 음 을 표시 합 니 다.볼 수 있 습 니 다.되 돌아 갑 니 다.
3.방 문 된 trxid 이상 maxtrx_id,이 버 전이 readview 를 생 성 할 때 아직 열 리 지 않 았 음 을 나타 내 며 보이 지 않 고 되 돌아 갑 니 다.
4、방문 한 trxid 는 mintrx_id 와 maxtrx_id 사이,m 여 부 를 판단 합 니 다.ids 에서 만약 에 있 으 면 readview 를 생 성 할 때 이 버 전의 업무 가 제출 되 지 않 았 고 이 버 전 은 보이 지 않 습 니 다.없 으 면 readview 를 만 들 때 이 버 전 트 랜 잭 션 이 제출 되 었 음 을 설명 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기