本文实例讲述了MySQL锁机制与用法。,具体如下:
MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是页面锁,但也支持表级锁;InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下采用行级锁。
MySQL这3种锁的特性可大致归纳如下:
(1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
(2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
(3)页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
仅从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理系统。
一、MyISAM表锁
1. 查询表级锁争用情况
show status like 'table%'; |
如果table_locks_waited 的值比较高,则说明存在着比较严重的表级锁争用情况。
2. MySQL表级锁的锁模式
MySQL 的表级锁有两种模式:表共享读锁和表独占写锁。
当一个session对某个表加了读锁之后,该session只能访问加锁的这个表,而且只能进行读操作;其他session可以对这个表进行读操作,但是进行写操作会被阻塞,需要等待锁的释放。当一个session对某个表加了写锁之后,该session只能访问加锁的这个表,可以进行读操作和写操作,其他session对这个表的读和写操作都会被阻塞,需要等待锁的释放。
MyISAM 表的读操作与写操作之间,以及写操作之间是串行的。
3. 如何加表锁
加读锁:
lock table tbl_name read; |
加写锁:
lock table tbl_name write; |
释放锁:
unlock tables; |
MyISAM 在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新操作前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。给MyISAM表显式加锁,一般是为了在一定程度模拟事务操作,实现对某一时间点多个表的一致性读取。
注意,当使用LOCK TABLES时,不仅需要一次锁定用到的所有表,而且,同一个表在SQL语句中出现多少次,就要通过与SQL语句中相同的别名锁定多少次,否则也会出错!
4. 并发插入
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
新闻热点
疑难解答