09 06 2021

Mysql锁机制

一、Mysql是一个单进程多线程架构数据库

        1、Mysql锁概述

            相对于其他数据库而言,Mysql的锁机制比较简单,最显著的特点就是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁,BDB存储引擎采用的是页面锁,但也支持表级锁,InnoDB存储引擎既支持表级锁,也支持行级锁,默认情况下采用的行级锁。

        2、Mysql这三种锁的特性大致归纳如下:开销、加锁速度、死锁、粒度、并发性能

            表级锁(锁定整个表):开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。注意:字段索引值,表级锁中字段没有索引,如果使用该字段作为操作条件会造成整张表锁定。

            行级锁(锁定某个id记录):开销大,加锁慢;会出现死锁;锁定粒度最小,发生冲突的概率最低,并发度也最高。

            页面所:开销和加锁时间介于表级锁和行级锁之间;会出现死锁;锁定粒度介于表级锁和行级锁之间,并发度一般。

            仅从锁的角度来说,表级锁更适合于查询为主,只有少量按索引条件更新数据的应用,如web应用;而行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理系统。

            从上述很难笼统的说哪种锁更好,只能就具体的应用特点来说哪种锁更适合。

            

            Mysql的表级锁有两种模式:表共享读锁(Table Read Lock) 和 表度占写锁(Table Write Lock),一般用于MyISAM存储引擎

            给表加锁:

            1. 表共享读锁,其他用户只能读取,不能添加、更改

            lock table 表名 read

            2. 表独占写锁,其他用户不能读取,也不能添加、更改

            lock table 表名 write


            Mysql的innoDB存储引擎一般使用悲观锁和乐观锁:

            悲观锁(文件锁、行锁):假设当前操作一定会发生冲突,屏蔽一切,阻塞、等待状态,适用于访问量少的场合,不能用于访问量大,并发高的场合,“速度慢,性能差”


            说明:

            1. 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,会阻塞其他用户对同一表的读写操作,MyISAM表的读操作于写操作之间,以及写操作之间是串行的!当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程读、写操作都会等待,直到锁被释放为止。

            2. 一个session使用LOCK TABLE命令给表f加了读锁,这个session可以查询锁定表中记录,但更新或者访问其他表都会提示错误;同时,另一个session可以查询f表的记录,但更新就会出现锁等待。

        3、并发插入