MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
- MyISAM和MEMORY存储引擎采用的是表级锁(
table-level locking
)。 - BDB 存储引擎采用的是页面锁(
page-level locking
),但也支持表级锁。 - InnoDB存储引擎既支持行级锁(
row-level locking
),也支持表级锁,但默认情况下是采用行级锁。
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
- 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
MySQL 的表级锁有两种模式:
- 表共享读锁(
Table Read Lock
) - 表独占写锁(
Table Write Lock
)
mysql表锁兼容性
- 读操作,不会阻塞其他用户对同一表的读操作,但会阻塞对同一表的写操作
- 写操作,会阻塞其他用户对同一表的写操作
- 执行查询语句(
SELECT
)前,会自动给涉及的所有表加读锁。 - 在执行更新操作 (
UPDATE
、DELETE
、INSERT
等)前,会自动给涉及的表加写锁。
这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE
命令给MyISAM表显式加锁。
如果用户想要显示的加锁可以使用以下命令:
锁定表:L
OCK
TABLES tbl_name {READ | WRITE};
解锁表:UNLOCK TABLES
写阻塞读例子
session_1 | session_2 |
//获取写锁 lock table film_text write; |
|
//对film_text进行读取,插入,更新操作 select * from film_text where film_id=999\G; insert into film_text(film_id,title) value (1001,‘Test‘); update film_text set title=‘Test1‘ where film_id=‘1001‘; |
//对session_2进行操作 //读操作等待 select * from film_text where film_id=999\G; //写操作等待 insert into film_text(film_id,title) value (1001,‘Test‘); |
//session_1 释放锁 UNLOCK TABLES; |
|
//释放锁后,session_2再次进行读,写操作 select * from film_text where film_id=999\G; insert into film_text(film_id,title) value (1002,‘Test‘); |
时间: 2024-10-24 17:57:14