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)等待图,普遍采用

 

 

 

锁升级

指当前锁的粒度降低

 

posted @ 2019-07-09 14:28  褐色键盘  阅读(184)  评论(0)    收藏  举报