MySQL锁机制
MySQL锁机制的由来与分类
锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线程的应用自然无法将机器性能发挥到最大,想要让程序的并发性越高,多线程技术自然就呼之欲出,多线程技术一方面能充分压榨CPU资源,另一方面也能提升程序的并发支持性。 多线程技术虽然能带来一系列的优势,但也因此引发了一个致命问题:线程安全问题,为了解决多线程并发执行造成的这个问题,从而又引出了锁机制,通过加锁执行的方式解决这类问题。 #### MySQL锁的由来 事务是基于数据库连接的,而每个数据库连接在MySQL中,又会用一条工作线程来维护,也意味着一个事务的执行,本质上就是一条工作线程在执行,当出现多个事务同时执行时,这种情况则被称之为并发事务,所谓的并发事务也就是指多条线程并发执行。 多线程并发执行自然就会出问题,也就是脏写、脏读、不可重复读以及幻读问题,而对于这些问题又可以通过调整事务的隔离级别来避免,那为什么调整事务的隔离级别后能避免这些问题产生呢?这是因为不同的隔离级别中,工作线程执行SQL语句时,用的锁粒度、类型不同。 也就是说,数据库的锁机制本身是为了解决并发事务带来的问题而诞生的,主要是确保数据库中,多条工作线程并行执行时的数据安全性。 #### MySQL锁的分类 - 以锁粒度的维度划分: - `表锁`: - 全局锁:加上全局锁之后,整个数据库只能允许读,不允许做任何写操作。 - 元数据锁 / MDL锁:基于表的元数据加锁,加锁后整张表不允许其他事务操作。 - 意向锁:这个是InnoDB中为了支持多粒度的锁,为了兼容行锁、表锁而设计的。 - 自增锁 / AUTO-INC锁:这个是为了提升自增ID的并发插入性能而设计的。 - `页面锁` - `行锁`: - 记录锁 / Record锁:也就是行锁,一条记录和一行数据是同一个意思。 - 间隙锁 / Gap锁:InnoDB中解决幻读问题的一种锁机制。 - 临建锁 / Next-Key锁:间隙锁的升级版,同时具备记录锁+间隙锁的功能。 - 以互斥性的维度划分: - `共享锁 / S锁`:不同事务之间不会相互排斥、可以同时获取的锁。 - `排他锁 / X锁`:不同事务之间会相互排斥、同时只能允许一个事务获取的锁。 - `共享排他锁 / SX锁`:MySQL5.7版本中新引入的锁,主要是解决SMO带来的问题。 - 以操作类型的维度划分: - `读锁`:查询数据时使用的锁。 - `写锁`:执行插入、删除、修改、DDL语句时使用的锁。 - 以加锁方式的维度划分: - `显示锁`:编写SQL语句时,手动指定加锁的粒度。 - `隐式锁`:执行SQL语句时,根据隔离级别自动为SQL操作加锁。 - 以思想的维度划分: - `乐观锁`:每次执行前认为自己会成功,因此先尝试执行,失败时再获取锁。 - `悲观锁`:每次执行前都认为自己无法成功,因此会先获取锁,然后再执行。
顶部
收展
底部
[TOC]
目录
MySQL锁机制的由来与分类
MySQL共享锁与排他锁
MySQL表锁
MySQL行锁
MySQL页面锁、乐观锁与悲观锁
MySQL死锁
MySQL锁机制的底层实现原理
相关推荐
MySQL教程
MySQL命令
MySQL索引
MySQL事务
MySQL版本特性