이 네 가지 격리 수준은 여러 트랜잭션 동시성 충돌이 있는 경우 더티 읽기, 반복 불가능 읽기, 팬텀 읽기 등의 문제가 발생할 수 있으며 innoDB code>반복 읽기 격리 수준 모드에서는 팬텀 읽기 문제가 해결됩니다. <code>innoDB
在可重复读隔离级别模式下解决了幻读的一个问题,
幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致
如图,第一个事务里面,我们执行一个范围查询,这个时候满足条件的数据只有一条,而在第二个事务里面,它插入一行数据并且进行了提交,接着第一个事务再去查询的时候,得到的结果比第一次查询的结果多出来一条数据,注意第一个事务的第一次和第二次查询,都在同一个事物里面,所以,幻读会带来数据一致性的问题
InnoDB引入间隙锁
和next-key lock
机制去解决幻读问题
假如现在存在这样一个B+Tree的索引结构,这个结构有4个索引元素,分别是1,4,7,10 当我们通过主键索引查询一条记录,并且对这条记录通过for update
加锁的时候
这个时候会产生一个记录锁,也就是行锁,锁定id=1
这个索引
被锁定的记录在锁释放之前,其他事务无法对这一条记录做任何操作的,前面我们所过对幻读的定义,幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致,注意这里敲掉的是范围查询,也就是说要解决幻读的问题,必须保证一个点
就是如果一个事务通过这样一条语句进行锁定的时候,另外一个事务再执行
这样一条insert语句需要被阻塞,直到前面获得所的事务被释放,所以在innonDB设计一种间隙锁
,它的主要功能是锁定一定范围内的索引记录
当对查询范围id > 4 and id 这个范围加锁的时候,会针对B+数中(4,7)这个开区间的范围加<code>间隙锁
,意味着在这种情况下其他事务对这个区间的数据进行插入更新删除都会被锁住,但是还有另外一种情况,比如像这样
这条查询语句针对id > 4
这个条件加锁,那么它需要锁定多个索引区间,所以这个情况下InnoDB引入一个叫next-key lock
机制,next-key lock
相当于间隙锁和记录锁的合集,记录锁锁定存在记录的行,间隙锁锁住的是记录行之间的间隙,而next-key lock
锁住的是两者的和
每个数据行非唯一的索引列,都会存在一把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
gap lock
및 next-key lock
메커니즘을 도입합니다🎜🎜🎜🎜이런 B+Tree 인덱스 구조가 있다고 가정해 보겠습니다. 이제 이 구조에는 4개의 인덱스 요소, 즉 1, 4, 7, 10이 있습니다. 기본 키 인덱스를 통해 레코드를 쿼리하고 for update
🎜🎜🎜🎜이때 레코드 잠금이 생성됩니다 , 즉, 행 잠금, 인덱스 id=1
🎜🎜🎜🎜잠금이 해제되기 전에 다른 트랜잭션은 잠긴 레코드에 대해 어떤 작업도 수행할 수 없습니다. 앞서 말했듯이 팬텀 읽기는 동일한 트랜잭션에서 수행된다는 의미입니다. , 동일한 범위를 두 번 쿼리했을 때 얻은 결과는 일치하지 않습니다. 여기서 범위 쿼리가 녹아웃되었습니다. 즉, 팬텀 읽기 문제를 해결하려면 한 지점이 보장되어야 합니다🎜🎜🎜🎜즉, 이러한 문을 통해 트랜잭션이 잠긴 경우 , 또 다른 트랜잭션이 실행됩니다🎜🎜🎜🎜 이러한 삽입 문은 이전에 얻은 트랜잭션이 해제될 때까지 차단되어야 하므로 innonDB에서는 gap lock
이 설계되어 있으며 해당 주요 기능은 특정 범위 내에서 인덱스 레코드를 잠그는 것입니다. 🎜🎜쿼리할 때 범위 id > 4 및 id 이 잠겨 있으면 간격 잠금
이 B+ 번호의 열린 간격 범위(4, 7)에 추가됩니다. 즉, 이 경우 이 범위의 데이터를 삽입, 업데이트 또는 삭제하는 다른 트랜잭션이 잠기지만 이와 같은 또 다른 상황이 있습니다 🎜🎜🎜🎜이 쿼리 문은 id > 4
조건을 추가합니다. 잠금을 수행하려면 여러 인덱스 범위를 잠가야 하므로 이 경우 InnoDB는 다음 키 잠금
이라는 메커니즘을 도입합니다. 다음 키 잠금
은 갭 잠금 및 기록과 동일합니다. 잠금 레코드 모음, 레코드 잠금은 레코드가 있는 행을 잠그고, 간격 잠금은 레코드 행 사이의 간격을 잠그고, 다음 키 잠금
은 둘의 합계를 잠급니다🎜🎜🎜🎜고유하지 않은 인덱스 열 각 데이터 행에 대해 다음 키 잠금
이 있습니다. 트랜잭션이 이 데이터 행의 다음 키 잠금
을 보유하면 열리는 섹션이 잠깁니다. 간격 데이터는 왼쪽에서 닫히므로 id > 4
와 같은 범위를 통해 잠글 때 InnoDB는 다음 키 잠금
잠금을 추가합니다. 잠긴 간격 범위는 (4,7](7,10](10,+♾️]입니다. gap lock
과 next-key lock
의 차이점은 잠금 범위입니다. gap lock
은 두 인덱스와 next 사이의 간격을 잠급니다. -key lock
은 record lock
및 gap lock
을 포함하는 여러 인덱스 범위를 잠급니다. 범위 쿼리를 사용하면 레코드 레코드에 도달할 뿐만 아니라 Gap gap도 포함되는 경우, 이 경우에는 다음 키 잠금, 즉 Mysql의 기본 행 잠금 알고리즘인 next-key 잠금
이 사용됩니다🎜
위 내용은 Mysql의 innoDB에서 팬텀 읽기를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!