MYSQL技术内幕-innoDB存储引擎 第六章 锁
什么是锁
lock与latch
latch一般称为拴锁,轻量级的锁
在innoDB存储引擎中,latch又分为mutex(互斥量)和rwlock(读写锁)
用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测机制
lock的对象是事务,用来锁定数据库中的对象,如表,页,行
innoDB存储引擎中的锁
1 锁的类型
行级锁:
(1)共享锁(S Lock),允许事务读一行数据
(2)排他锁(X Lock),允许事务删除或更新一行数据
意向锁为表级别的锁
(1)意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁
(2)意向排他锁(IX Lock),事务想要获得一张表中某几行的排他锁
innoDB1.0之后,在information_schema架构下添加了表innodb_trx,innodb_locks,innodb_lock_waits,可以简单地监控当前事务,并分析可能存在的锁问题
2 一致性非锁定读
指innoDB存储引擎通过行多版本控制(MVCC)的方式来读取数据,这是默认的读取方式,单不是每个事务隔离级别都采用这种方式
在read committed和repeatable read隔离级别下,innoDB存储引擎使用非锁定的一致性读,
read committed下非一致性读总是读取被锁定行的最新一份快照数据
repeatable read总是读事务开始时的行数据版本
3 一致性锁定读
对select语句支持两种一致性的锁定读操作
(1)select ···for update
(2)select···lock in share mode
4 自增长与锁
mysql 5.1.22之前自增长列采用一种特殊的表锁机制,auto-inc locking,会存在一些性能上的问题,
之后采用轻量级互斥量的自增长实现机制,
5 外键和锁
锁的算法
1 行锁的三种算法
(1)record lock :单个行记录上的锁
(2)gap lock :间歇锁,锁定一个范围,不包括记录本身
(3)next-key lock :gap lock+record lock,锁定一个范围,并且锁定记录本身
2 解决phantom problem
在默认repeatable read隔离级别下,innodb采用next-key locking机制来避免phantom problem(幻读)
锁问题
1 脏读
读到了未提交的数据
2 不可重复读
3 丢失更新
阻塞
死锁
1 死锁的概念
两个或以上事务,因争夺锁资源而互相等待的现象,解决方案:
(1)超时
(2)等待图,普遍采用
锁升级
指当前锁的粒度降低

浙公网安备 33010602011771号