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、并发插入