>  기사  >  데이터 베이스  >  MySQL의 MVCC 메커니즘은 무엇입니까

MySQL의 MVCC 메커니즘은 무엇입니까

PHPz
PHPz앞으로
2023-06-03 09:41:161644검색

1. 개요:

MVCC, 정식 명칭은 Multi-Version Concurrency Control, 즉 다중 버전 동시성 제어입니다. MVCC는 다중 동시성 제어 방법으로 일반적으로 데이터베이스 관리 시스템에서 데이터베이스에 대한 동시 액세스를 달성하고 프로그래밍 언어로 트랜잭션 메모리를 구현하는 데 사용됩니다.
우리는 MySql이 5.5 이후 MyISAM 스토리지 엔진에서 InnoDB 스토리지 엔진으로 변경된 것을 알고 있습니다. 주로 InnoDB가 트랜잭션을 지원하기 때문에 여러 스레드가 동시에 실행될 때 동시성 문제가 발생할 수 있습니다. 이때 동시성을 제어할 수 있는 방법이 등장할 수 있는데, MVCC가 그 역할을 한다.

MVCC는 주로 undo 로그 버전 체인과 ReadView로 구현됩니다.

2. Undo 로그란 무엇입니까

  • Undo 로그는 주로 트랜잭션 롤백 시 원본 데이터를 복원하는 데 사용됩니다.

  • mysql이 sql을 실행할 때, 그날의 논리적으로 반대되는 로그를 undo 로그에 저장합니다. 따라서 Undo 로그에 기록되는 것도 논리적 로그이다.

  • 그러나 mysql이 Insert 문을 실행할 때 이 삽입의 기본 키 ID가 실행 취소 로그에 기록됩니다. 트랜잭션이 롤백되면 delete는 이 ID를 삭제합니다.

  • 업데이트 문을 실행하면 MySQL은 수정 전의 데이터를 실행 취소 로그에 저장합니다. 트랜잭션이 롤백되면 원본 데이터를 얻기 위해 다시 업데이트가 수행됩니다.

  • MySQL이 삭제 문을 실행하면 삭제 전 데이터가 실행 취소 로그에 저장됩니다. 트랜잭션이 롤백되면 다시 insert를 실행하여 원본 데이터를 삽입합니다.

  • 데이터베이스의 네 가지 주요 특징 - 원자성, 즉 트랜잭션은 모두 성공하거나 모두 실패할 수 없으며 맨 아래 계층은 실행 취소 로그에 의해 달성됩니다. 특정 문 실행이 실패하면 이전 트랜잭션의 문이 롤백됩니다.

3. 행의 숨겨진 열

  • 데이터베이스의 각 행에는 실제 데이터를 저장하는 것 외에도 row_id, trx_id 및 Roll_pointer

  • row_id, 행 번호라는 3개의 숨겨진 열이 있습니다.

현재 테이블에 정수형 기본 키가 있으면 row_id 값은 기본 키 값이 됩니다.
정수형 기본 키가 없으면 MySQL은 비어 있지 않은 정수형 고유 인덱스를 다음과 같이 선택합니다. 필드 순서대로 row_id
둘 다 없으면 자동으로 증가하는 정수가 row_id

  • trx_id, 트랜잭션 번호:

로 생성됩니다. 트랜잭션이 실행되기 시작하면 MySQL은 전역 변수를 할당합니다. 트랜잭션 ID에 대한 자동 증가 트랜잭션입니다.
이후 트랜잭션이 현재 트랜잭션을 추가, 수정, 삭제하는 등의 작업을 수행하면 trx_id에 자체 트랜잭션 ID가 기록됩니다.

  • roll_pointer, 롤백 포인터:

트랜잭션이 현재 데이터를 변경하면 이전 데이터가 실행 취소 로그에 기록되고 해당 데이터는 현재 행에 기록되며 현재 Roll_pointer가 지점을 가리킵니다. 지금 실행 취소 로그에 저장되므로 이전 버전은 Roll_pointer를 통해 확인할 수 있습니다.
Row를 변경하는 트랜잭션이 있을 경우 Undo 로그가 지속적으로 생성되며 최종적으로 Undo 로그 버전 체인이 형성됩니다.

4. Undo 로그 버전 체인

처음에는 다음 명령문을 사용하여 stduent 테이블을 생성합니다.

CREATE TABLE `student` (
	`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR ( 255 ) NOT NULL,
	`age` INT ( 11 ) NOT NULL,
  PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = INNODB;

이제 첫 번째 트랜잭션을 엽니다. 트랜잭션 ID는 1이고 다음 삽입 문을 실행합니다.

INSERT INTO student VALUES ( 1, "a", 24 );

그러면 현재 다이어그램은 다음과 같습니다.

MySQL의 MVCC 메커니즘은 무엇입니까

데이터가 새로 삽입되었기 때문에 해당 Roll_pointer가 가리키는 실행 취소 로그가 비어 있습니다.

그런 다음 두 번째 트랜잭션을 열고 할당된 트랜잭션 ID는 2이고 다음 수정 명령을 실행합니다.

UPDATE student SET NAME = 'b' WHERE id = 1;

현재 다이어그램은 다음과 같이 변경됩니다.

MySQL의 MVCC 메커니즘은 무엇입니까

세 번째 트랜잭션이 열리고 할당된 트랜잭션 ID가 3일 때 다음 수정 명령을 실행합니다.

UPDATE student SET age = 25 WHERE id = 1;

다이어그램은 다음과 같습니다.

MySQL의 MVCC 메커니즘은 무엇입니까

각 트랜잭션이 행을 변경할 때 이전 버전을 저장하기 위해 실행 취소 로그가 생성된 다음, 방금 생성된 실행 취소 로그를 가리키는 새 버전의 Roll_pointer를 가리킵니다.
따라서 Roll_pointer는 이러한 다양한 버전의 실행 취소 로그를 직렬로 연결하여 실행 취소 로그의 버전 체인을 형성할 수 있습니다.

5. ReadView에 대하여

먼저 스냅샷 읽기와 현재 읽기를 이해해야 합니다.
스냅샷 읽기: 공유 모드에서 select …을 포함하지 않는 간단한 선택 쿼리로 업데이트를 위해 …을 선택하면 됩니다. 데이터 버전의 기록.
현재 읽기: 다음 문은 모두 현재 읽기이며, 항상 최신 버전을 읽고, 최신 버전 읽기를 잠급니다.

select ... lock in share mode
select ... for update
insert
update
delete

트랜잭션이 각각의 스냅샷 읽기를 수행하거나 처음으로 스냅샷 읽기를 수행할 때 ReadView라는 일관된 뷰가 생성됩니다.
ReadView의 기능은 실행 취소 로그 버전 체인의 어떤 데이터가 현재 트랜잭션에 표시되는지 결정하는 것입니다.

ReadView에는 다음과 같은 중요한 매개변수가 포함되어 있습니다.

  • m_ids

    • ReadView가 생성되는 순간 mysql에서 커밋되지 않은 모든 트랜잭션 ID의 모음입니다.

  • min_trx_id

    • m_ids中的最小值

  • max_trx_id

    • mysql即将为下一个事务分配的事务id,并不是m_ids中的最大值。

  • creator_trx_id

    • 即创建此ReadView的事务id

简要的示意图如下:

MySQL의 MVCC 메커니즘은 무엇입니까

那么事务在执行快照读时,可以通过以下的规则来确定undo log版本链上的哪个版本数据可见。

  • 如果当前undo log的版本的trx_id

  • 如果当前undo log的版本的trx_id≥max_trx_id,说明该版本对应的事务在生成ReadView之后才开始的,因此是不可见的。

  • 如果当前undo log的版本的trx_id∈[min_trx_id,max_trx_id),如果在这个范围里,还要判断trx_id是否在m_ids中:

  在m_ids中,说明版本对应的事务未提交,因此是不可见的。

  不在m_ids中,说明版本对应的事务已经提交,因此是可见的。
  • 如果当前undo log的版本的trx_id=creator_trxt_id,说明事务正在访问自己修改的数据,因此是可见的。

  • 当undo log版本链表的头结点数据被判定为不可见时,则利用roll_pointer找到上一个版本,再进行判断。如果整个链表中都没有找到可见的数据,则代表当前的查询找不到数据。

위 내용은 MySQL의 MVCC 메커니즘은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제