Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

WBOY
풀어 주다: 2023-05-27 15:34:20
앞으로
1690명이 탐색했습니다.

1.Mysql 트랜잭션 격리 수준

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

이 네 가지 격리 수준은 여러 트랜잭션 동시성 충돌이 있는 경우 더티 읽기, 반복 불가능 읽기, 팬텀 읽기 등의 문제가 발생할 수 있으며 innoDB code>반복 읽기 격리 수준 모드에서는 팬텀 읽기 문제가 해결됩니다. <code>innoDB在可重复读隔离级别模式下解决了幻读的一个问题,

2. 什么是幻读

幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

如图,第一个事务里面,我们执行一个范围查询,这个时候满足条件的数据只有一条,而在第二个事务里面,它插入一行数据并且进行了提交,接着第一个事务再去查询的时候,得到的结果比第一次查询的结果多出来一条数据,注意第一个事务的第一次和第二次查询,都在同一个事物里面,所以,幻读会带来数据一致性的问题

3. InnoDB如何解决幻读的问题

InnoDB引入间隙锁next-key lock机制去解决幻读问题

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

假如现在存在这样一个B+Tree的索引结构,这个结构有4个索引元素,分别是1,4,7,10 当我们通过主键索引查询一条记录,并且对这条记录通过for update加锁的时候

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

这个时候会产生一个记录锁,也就是行锁,锁定id=1这个索引

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

被锁定的记录在锁释放之前,其他事务无法对这一条记录做任何操作的,前面我们所过对幻读的定义,幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致,注意这里敲掉的是范围查询,也就是说要解决幻读的问题,必须保证一个点

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

就是如果一个事务通过这样一条语句进行锁定的时候,另外一个事务再执行

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

这样一条insert语句需要被阻塞,直到前面获得所的事务被释放,所以在innonDB设计一种间隙锁,它的主要功能是锁定一定范围内的索引记录

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

当对查询范围id > 4 and id 这个范围加锁的时候,会针对B+数中(4,7)这个开区间的范围加<code>间隙锁,意味着在这种情况下其他事务对这个区间的数据进行插入更新删除都会被锁住,但是还有另外一种情况,比如像这样

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

这条查询语句针对id > 4这个条件加锁,那么它需要锁定多个索引区间,所以这个情况下InnoDB引入一个叫next-key lock机制,next-key lock相当于间隙锁和记录锁的合集,记录锁锁定存在记录的行,间隙锁锁住的是记录行之间的间隙,而next-key lock锁住的是两者的和

Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법

每个数据行非唯一的索引列,都会存在一把next-key lock,当某个事务持有这一行数据的next-key lock的时候,会锁住一段在左开右闭区间的数据,因此当通过id > 4这样一个范围加锁的时候,InnoDB会去加一个next-key lock锁,锁定的区间范围是(4,7 ](7,10 ](10,+♾️ ]。间隙锁next-key lock的区别是在加锁的范围,间隙锁锁定的是两个索引之间的间隙,而next-key lock会锁定多个索引区间,它包含记录锁间隙锁当我们使用范围查询不仅仅命中Record记录,还包含了Gap间隙的时候,在这种情况下使用的就是临键锁,也就是next-key lock

2. 팬텀 읽기란 동일한 트랜잭션에서 동일한 범위를 두 번 쿼리했을 때 얻은 결과를 말합니다🎜 🎜🎜🎜그림과 같은 , 첫 번째 트랜잭션에서는 범위 쿼리를 실행합니다. 이때 조건을 충족하는 데이터는 하나뿐입니다. 두 번째 트랜잭션에서는 데이터 행을 삽입하고 첫 번째 트랜잭션에서 다시 쿼리합니다. , 얻은 결과는 첫 번째 쿼리 결과보다 하나 더 많은 데이터입니다. 첫 번째 트랜잭션의 첫 번째 쿼리와 두 번째 쿼리는 모두 동일하므로 팬텀 읽기는 데이터 일관성 문제를 발생시킵니다. 🎜🎜3. InnoDB가 팬텀 읽기 문제를 해결하는 방법🎜🎜InnoDB는 팬텀 읽기 문제를 해결하기 위해 gap locknext-key lock 메커니즘을 도입합니다🎜🎜Mysql에서 innoDB의 팬텀 읽기를 해결하는 방법🎜🎜이런 B+Tree 인덱스 구조가 있다고 가정해 보겠습니다. 이제 이 구조에는 4개의 인덱스 요소, 즉 1, 4, 7, 10이 있습니다. 기본 키 인덱스를 통해 레코드를 쿼리하고 for update🎜🎜Mysql에서 innoDB의 팬텀 읽기 문제를 해결하는 방법🎜🎜이때 레코드 잠금이 생성됩니다 , 즉, 행 잠금, 인덱스 id=1🎜🎜Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법🎜🎜잠금이 해제되기 전에 다른 트랜잭션은 잠긴 레코드에 대해 어떤 작업도 수행할 수 없습니다. 앞서 말했듯이 팬텀 읽기는 동일한 트랜잭션에서 수행된다는 의미입니다. , 동일한 범위를 두 번 쿼리했을 때 얻은 결과는 일치하지 않습니다. 여기서 범위 쿼리가 녹아웃되었습니다. 즉, 팬텀 읽기 문제를 해결하려면 한 지점이 보장되어야 합니다🎜🎜Mysql에서 innoDB의 팬텀 읽기를 해결하는 방법🎜🎜즉, 이러한 문을 통해 트랜잭션이 잠긴 경우 , 또 다른 트랜잭션이 실행됩니다🎜🎜Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법 🎜🎜 이러한 삽입 문은 이전에 얻은 트랜잭션이 해제될 때까지 차단되어야 하므로 innonDB에서는 gap lock이 설계되어 있으며 해당 주요 기능은 특정 범위 내에서 인덱스 레코드를 잠그는 것입니다. Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법🎜🎜쿼리할 때 범위 id > 4 및 id 이 잠겨 있으면 간격 잠금이 B+ 번호의 열린 간격 범위(4, 7)에 추가됩니다. 즉, 이 경우 이 범위의 데이터를 삽입, 업데이트 또는 삭제하는 다른 트랜잭션이 잠기지만 이와 같은 또 다른 상황이 있습니다 🎜🎜Mysql에서 innoDB의 팬텀 읽기를 해결하는 방법🎜🎜이 쿼리 문은 id > 4 조건을 추가합니다. 잠금을 수행하려면 여러 인덱스 범위를 잠가야 하므로 이 경우 InnoDB는 다음 키 잠금이라는 메커니즘을 도입합니다. 다음 키 잠금은 갭 잠금 및 기록과 동일합니다. 잠금 레코드 모음, 레코드 잠금은 레코드가 있는 행을 잠그고, 간격 잠금은 레코드 행 사이의 간격을 잠그고, 다음 키 잠금은 둘의 합계를 잠급니다🎜🎜🎜🎜고유하지 않은 인덱스 열 각 데이터 행에 대해 다음 키 잠금이 있습니다. 트랜잭션이 이 데이터 행의 다음 키 잠금을 보유하면 열리는 섹션이 잠깁니다. 간격 데이터는 왼쪽에서 닫히므로 id > 4와 같은 범위를 통해 잠글 때 InnoDB는 다음 키 잠금 잠금을 추가합니다. 잠긴 간격 범위는 (4,7](7,10](10,+♾️]입니다. gap locknext-key lock의 차이점은 잠금 범위입니다. gap lock은 두 인덱스와 next 사이의 간격을 잠급니다. -key lockrecord lockgap lock을 포함하는 여러 인덱스 범위를 잠급니다. 범위 쿼리를 사용하면 레코드 레코드에 도달할 뿐만 아니라 Gap gap도 포함되는 경우, 이 경우에는 다음 키 잠금, 즉 Mysql의 기본 행 잠금 알고리즘인 next-key 잠금이 사용됩니다🎜

위 내용은 Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿