>  기사  >  데이터 베이스  >  MySQL 데이터베이스 트랜잭션 격리 수준에 대한 자세한 소개

MySQL 데이터베이스 트랜잭션 격리 수준에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-16 13:38:111537검색

본 글에서는 MySQL 데이터베이스 트랜잭션 격리 수준에 대한 자세한 설명을 주로 소개합니다. 필요한 친구는

데이터베이스 트랜잭션 격리 수준을 참조하세요. 🎜>

데이터베이스 트랜잭션에는 낮은 수준에서 높은 수준까지 4가지 격리 수준이 있습니다.

  1. 커밋되지 않은 읽기: 더티 읽기가 허용됩니다.

  2. 커밋된 읽기: 가장 일반적으로 사용되는 격리 수준이자 대부분의 데이터베이스에 대한 기본 격리 수준인 더티 읽기를 방지합니다.

  3. 반복 읽기: 더티 읽기 및 반복 불가능한 읽기를 방지할 수 있습니다.

  4. 직렬화 가능: 데이터베이스 효율성을 저하시키는 더티 읽기(dirty read), 반복 불가능 읽기 및 팬텀 읽기(트랜잭션 직렬화)를 방지할 수 있습니다.

이 네 가지 레벨은 더티 읽기, 반복 불가능 읽기, 팬텀 읽기 등의 문제를 하나씩 해결할 수 있습니다.

√: 발생할 수 있음 ×: 발생하지 않음

事务级别 脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×
참고: 주로 다중 동시 트랜잭션의 경우 격리 수준 시나리오에 대해 논의합니다.

더티 읽기, 팬텀 읽기, 반복 불가능 읽기

더티 읽기:

더티 읽기는 트랜잭션이 진행 중 데이터에 액세스하여 수정했지만 아직 수정 사항이 데이터베이스에 제출되지 않았습니다. 이때 다른 트랜잭션도 해당 데이터에 액세스한 후 해당 데이터를 사용합니다.

반복 불가능한 읽기:

는 트랜잭션 내에서 동일한 데이터를 여러 번 읽는 것을 의미합니다. 이 트랜잭션이 끝나기 전에 다른 트랜잭션도 동일한 데이터에 액세스합니다. 그러면 첫 번째 트랜잭션에서 두 번 읽은 데이터 사이에 두 번째 트랜잭션의 수정으로 인해 첫 번째 트랜잭션에서 두 번 읽은 데이터가 다를 수 있습니다. 이와 같이 트랜잭션 내에서 두 번 읽은 데이터가 다르기 때문에 반복 불가능 읽기라고 합니다. (즉, 동일한 데이터 내용을 읽을 수 없음)

환상 읽기:

은 첫 번째와 같이 트랜잭션이 독립적으로 실행되지 않을 때 발생하는 현상을 말합니다. transaction 테이블의 데이터가 수정되었으며, 이 수정에는 테이블의 모든 데이터 행이 포함됩니다. 동시에 두 번째 트랜잭션도 이 테이블의 데이터를 수정합니다. 이 수정으로 인해 테이블에 새 데이터 행이 삽입됩니다. 그러면 나중에 첫 번째 트랜잭션을 수행한 사용자는 마치 환각이 발생한 것처럼 테이블에 아직 수정되지 않은 데이터 행이 있다는 것을 알게 될 것입니다.

예:

테이블:

CREATE TABLE `cc_wsyw126_user_test_isolation_copy` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `password` varchar(64) NOT NULL,
 `age` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `ix_age` (`age`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
시뮬레이션된 데이터:

INSERT INTO `cc_wsyw126_user_test_isolation_copy` (`password`, `age`) 
VALUES 
('1', 1),
('2', 2),
('3', 3),
('4', 4);
첫 번째 트랜잭션 A:

start transaction 
insert into cc_wsyw126_user_test_isolation_copy (password, age) values ('5',5)
commit
두 번째 트랜잭션 B:

start transaction 
update cc_wsyw126_user_test_isolation_copy set age = 2 where password >='2'
select * from cc_wsyw126_user_test_isolation_copy where password >= '2';
commit

재현 단계:

트랜잭션 A의 삽입 문이 트랜잭션 선택 이전과 트랜잭션 B 업데이트 이후인 한.

MySQL InnoDB 스토리지 엔진은 다중 버전 동시성 제어 프로토콜 -

MVCC(Multi-Version Concurrency Control) 및 갭 잠금(next -키 잠금) 전략을 구현합니다. RR(반복 읽기) 격리 수준에서는 팬텀 읽기가 없습니다. 팬텀 읽기를 테스트하려면 MyISAM에서 시도해 보세요.

클러스터형

인덱스 (기본 키 인덱스)에서 고유성 제약 조건 이 있는 경우 InnoDB는 기본 다음 키 잠금을 레코드 잠금으로 다운그레이드합니다.


위 내용은 MySQL 데이터베이스 트랜잭션 격리 수준에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.