InnoDB在不同隔离级别下的一致性读级锁的差异
锁和多版本数据是InnoDB实现一致性读和ISO/ANIS SQL92隔离级别的手段,因此,在不同的隔离级别下,InnoDB处理SQL时采用的一致性读策略和需要的锁是不同的。(下面的表来自《深入浅出MYSQL》20.3.7节)
SQL | 条件 | Read Uncommitted | Read Committed | Repeatable Read | Serializable |
select | 相等 | None locks | Consistenread/None lock | Consistenread/None lock | Share locks |
范围 | None locks | Consistenread/None lock | Consistenread/None lock | Share Next-key | |
update | 相等 | exclusive locks | exclusive locks | exclusive locks | exclusive locks |
范围 | exclusive next-key | exclusive next-key | exclusive next-key | exclusive next-key | |
insert | N/A | exclusive locks | exclusive locks | exclusive locks | exclusive locks |
replace | 无键冲突 | exclusive locks | exclusive locks | exclusive locks | exclusive locks |
键冲突 | exclusive next-key | exclusive next-key | exclusive next-key | exclusive next-key | |
delete | 相等 | exclusive locks | exclusive locks | exclusive locks | exclusive locks |
范围 | exclusive next-key | exclusive next-key | exclusive next-key | exclusive next-key | |
select ... from ... lock in share mode | 相等 | Share locks | Share locks | Share locks | Share locks |
范围 | Share locks | Share locks | Share Next-key | Share Next-key | |
select...from... for update | 相等 | exclusive locks | exclusive locks | exclusive locks | exclusive locks |
范围 | exclusive locks | exclusive locks | exclusive next-key | exclusive next-key | |
insert into...select...(指源表锁) | innodb_locks_unsafe_for_binlog=0 | share next-key | share next-key | share next-key | share next-key |
innodb_locks_unsafe_for_binlog=1 | None locks | Consistenread/None lock | Consistenread/None lock | Share next-key | |
create table... select ... (指源表锁) | innodb_locks_unsafe_for_binlog=0 | Share next-key | Share next-key | Share next-key | Share next-key |
innodb_locks_unsafe_for_binlog=1 | None locks | Consistenread/None lock | Consistenread/None lock | Share next-key |