首页 > 数据库 > MySQL > 正文

MySQL锁机制与用法分析

2024-07-24 12:50:21
字体:
来源:转载
供稿:网友

本文实例讲述了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。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表