page contents

行锁:InnoDB 替代 MyISAM 的重要原因

MySQL 5.5 之前的默认存储引擎是 MyISAM,5.5 之后改成了 InnoDB。InnoDB 后来居上最主要的原因就是: InnoDB 支持事务:适合在并发条件下要求数据一致的场景。 InnoDB 支持行锁:有效降低由...

MySQL 5.5 之前的默认存储引擎是 MyISAM,5.5 之后改成了 InnoDB。InnoDB 后来居上最主要的原因就是:

InnoDB 支持事务:适合在并发条件下要求数据一致的场景。

InnoDB 支持行锁:有效降低由于删除或者更新导致的锁定。

本节就一起来探讨 InnoDB 的行锁。

在讲解行锁之前,我们首先来看一下两阶段锁协议。


1 两阶段锁

传统的关系型数据库加锁的一个原则是:两阶段锁原则。

两阶段锁:锁操作分为两个阶段,加锁阶段和解锁阶段,并且保证加锁阶段和解锁阶段不相交。在执行语句的时候加上锁,但并不是语句执行完就立刻释放锁,而是要等到事务结束时才释放。

我们可以通过下面这张表理解两阶段锁:

attachments-2020-01-ouzCpBqj5e144cd5b8a4d.png



2 InnoDB 行锁模式

InnoDB 实现了以下两种类型的行锁:

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

对于普通 select 语句,InnoDB 不会加任何锁,事务可以通过以下语句显式给记录集加共享锁或排他锁:

共享锁(S):select * from table_name where ... lock in share mode;

排他锁(X):select * from tablbe_name where ... for update;

3 InnoDB 行锁算法

InnoDB 行锁的三种算法:

Record Lock:单个记录上的索引加锁

Gap Lock:间隙锁,对索引项之间的间隙加锁,但不包括记录本身

Next-Key Lock:Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身。

InnoDB 行锁实现特点意味着:如果不通过索引条件检索数据,那么 InnoDB 将对表中所有记录加锁,实际效果跟表锁一样。


4 事务隔离级别

不同事务隔离级别对应的行锁也是不一样的,因此在讲解行锁的锁定范围之前,先简单聊聊事务隔离级别。事务隔离级别的详细介绍放在下一章。

MySQL 的 4 种隔离级别:

Read uncommitted(读未提交): 在该隔离级别,所有事务都可以看到其他未提交的事务的执行结果。可能会出现脏读。

Read Committed(读已提交,简称:RC):一个事务只能看见已经提交事务所做的改变。因为同一事务的其他实例在该实例处理期间可能会有新的 commit,所以可能出现幻读。

Repeatable Read(可重复读,简称:RR):这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。消除了脏读、不可重复读,默认也不会出现幻读。

Serializable(串行):这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

attachments-2020-01-ZqBfRvKo5e144ceaa13aa.png



5 RC 隔离级别下的行锁实验

有时我们可能会思考,某条语句(类似 select * from table_name where a=… for update)是怎么加锁的?

要想分析某条 SQL 是怎么加锁的,如果其他信息都不知道,那就得分几种情况了,不同情况加锁的方式也各不一样,比较常见的一些情况如下:

RC 隔离级别,a 字段没索引。

RC 隔离级别,a 字段有唯一索引。

RC 隔离级别,a 字段有非唯一索引。

RR 隔离级别,a 字段没索引。

RR 隔离级别,a 字段有唯一索引。

RR 隔离级别,a 字段有非唯一索引。

……
让我们开始实验吧!

attachments-2020-01-zu1g2yac5e144d109d146.png


  • 发表于 2020-01-07 17:21
  • 阅读 ( 574 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章