码迷,mamicode.com
首页 > 其他好文 > 详细

MyISAM表锁

时间:2017-07-11 11:12:10      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:delete   读取   不同   innodb   分享   border   font   image   机制   

MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。

  • MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking)。
  • BDB 存储引擎采用的是页面锁(page-level locking),但也支持表级锁。
  • InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

 

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

 

 

MySQL 的表级锁有两种模式:

  • 表共享读锁(Table Read Lock)
  • 表独占写锁(Table Write Lock)

 

mysql表锁兼容性

技术分享

 

  • 读操作,不会阻塞其他用户对同一表的读操作,但会阻塞对同一表的写操作
  • 写操作,会阻塞其他用户对同一表的写操作

 


 

 

  • 执行查询语句(SELECT)前,会自动给涉及的所有表加读锁。
  • 在执行更新操作 (UPDATEDELETEINSERT 等)前,会自动给涉及的表加写锁。

这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。

 


 

 

如果用户想要显示的加锁可以使用以下命令:

  • 锁定表:LOCK 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‘);

技术分享

 

 

MyISAM表锁

标签:delete   读取   不同   innodb   分享   border   font   image   机制   

原文地址:http://www.cnblogs.com/dsitn/p/7149354.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!