1 MySQL基础
1.1 关系型数据库介绍
1.2 MySQL连接
1.3 引擎类型及区别
1.4 MySQL数据类型
2 查看数据库基本信息
2.1 基本语句
2.2 其他补充语句
3 对表的增(INSERT)、删(DELETE)、查(SELECT)、改(UPDATE)
3.1 查询数据(SELECT)
3.2 更新数据(UPDATE)
3.3 增加数据(INSERT)
3.4 删除数据(DELETE)
3.5 扩展知识
4 复杂XXXX
5 常用函数
5.1 字符串函数
5.2 聚合函数
6 子查询和联结
6.1 子查询
6.2 联结
7 组合查询和全文本搜索
8 视图和存储过程
8.1 视图
8.2 存储过程
9 游标、触发器和事务管理
9.1 游标
9.2 触发器
9.3 事务
10 索引和性能分析
10.1 索引
11 MySQL高级知识
11.1 MySQL锁机制介绍
12 MySQL进阶知识
13 MySQL维护、安全管理和其他
13.1 MySQL关键字和保留字(5.7版本)

MySQL锁机制介绍

2017-12-24 10:51:00
linefo
1364
最后编辑:linefo 于 2017-12-24 11:22:40

MySQL锁的作用


锁机制,可以更好的保证数据的一致性(特别是高并发访问中),可以简单理解为,为需要的资源加一把锁,减少因多进程访问中操作(比如写入)冲突的概率。

举个例子,某列有unique(唯一性)索引,但在高并发的写入操作下,可能会出现有相同值的情况。

任何数据库都需要锁机制,MySQL也不例外。


锁定争议资源


举个例子,假设有1和2两个进程,同时都需要a和b两个资源,那么a和b此时就是锁定争议资源。


一次性封锁和两段锁


一次性封锁:在sql语句的开始执行的时候,已经预先知道要涉及到那些数据,然后全部锁住,在执行完毕之后,再全部解锁!(MyISAM引擎就是采用这样的方式)


两段锁:是指每个事务的执行可以分为两个阶段:生长阶段(加锁阶段)和衰退阶段(解锁阶段)。(InnoDB引擎采用这样的方式)

加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行;

解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。



死锁


死锁是出现锁定争议资源时,可能出现的一种问题。

竞争不可抢占资源引起死锁

p1进程此时持有a资源并且需要b资源,而匹配p2进程此时持有b资源并且需要a资源,那么就可能会出现,p1和p2都不肯释放手上的资源,并且互相等待对方释放资源的情况,此时如果没有外力作用,就会一直僵持下去。

竞争可消耗资源引起死锁

有p1、p2、p3共3个进程,p1向p2发送信息并接收p3的信息,p2向p3发送消息并接收p1的信息,p3向p1发送信息并接收p2的信息。

如果设置为,每个进程先接收到消息再进行发送,那么所有的信息都无法发送(因为是无效的逻辑)。

(.....................还有其他锁死情况.....................


锁粒度


即锁的级别,MySQL提供三种级别,分别是表级锁定、行级锁定、页级锁定


表级锁定

对整个表进行锁定,是最大颗粒度的锁定级别。

获取锁和释放锁的速度快,占用系统资源少(配合后面理解)。

并发性能相对弱(锁定整个表)。

出现死锁概率小(配合后面理解)。

使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。

适用性上,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用。


【表级锁扩展】


MySQL的表级锁(MyISAM只能实现表级锁)有两种模式:表共享读(read)锁和表独占写(write)锁

对MyISAM表的读操作,不会阻塞其他用户的对该表的读操作,但会阻塞对该表的写操作。

对MyISAM表的写操作,会阻塞其他用户对该表的读和写操作。

MyISAM引擎在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。


行级锁定

对行记录的锁定,是目前实现最小颗粒度的锁定级别。

获取锁和释放锁的速度慢,占用系统资源较多(一个表有多个行,行级锁定加锁的数量会比表级锁定多)

并发性能相对强(锁定记录[行],同表其他行可以访问))。

容易发生死锁(感觉上应该是加锁数量多,操作时接触锁的概率多,所以出现死锁的可能性多)

使用行级锁定的主要是InnoDB等事务性存储引擎。

适用性上,更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。


【行级锁定扩展】


InnoDB引擎的行级锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

InnoDB的行级锁有两种类型:共享锁排他锁

并且为了实现表级锁和行级锁共存,InnoDB使用了意向锁(表级锁)的概念。

进一步分类的话:共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX)

具体后面补......


页级锁定

MySQL中比较独特的一种锁定级别,锁定颗粒度>行级锁定,<表级锁定,并发性能和死锁的情况也介于两者之间。

实现机制略。

主要是BOB这类引擎在用。


加锁的方式


MySQL中,有两种加锁的方式

隐式锁:由系统自动控制加锁的时机和类型,用户无需操作,如MyISAM引擎中,操作都会使用表级锁。

显式锁:开发人员手动添加的锁,需要控制加锁时机、锁粒度、解锁条件等。


显示锁,以及维护锁和查看等,后面补,现在还不理解