MyISAM引擎的表锁

MyISAM引擎特点简述

  • 不支持事务
  • 不支持外键
  • 较小的逐渐范围
  • 支持全文检索
  • 不支持GIB数据
  • 查询效率高
  • 使用表锁

表锁特点

  锁住整个表,所以开销小,加锁比较快,无死锁情况,锁的粒度较大,在并发情况下,产生锁等待的概率比较高,所以支持的并发数较低,一般用于查找。

表锁类型

  • 读锁:也称为共享锁,针对同一张表,多并发读操作可以并行执行,并且互不影响,写会发生阻塞。
  • 写锁:也称为排它锁,针对同一张表,当前线程写操作时,会阻塞其他线程的读写操作。

手动表锁语法

mysql> LOCK TABLE 表名 [READ | WRITE] [,表名 [READ | WRITE]...]   #加锁 
mysql> UNLOCK TABLES    #解锁

状态查询

mysql> SHOW STATUS LIKE 'Table_locks_immediate';

表示可以立即获取锁的查询次数,每获取一次锁就增加1

 

mysql> SHOW STATUS LIKE 'Table_locks_waited';

表示锁等待的次数

 

最佳实践

读锁(共享锁)

步骤 Session1 Session2
1 给myisam_lock加读锁  
2 可以查询myisam_lock表数据 可以查询myisam_lock表数据
3 不可以增删改myisam_lock表数据 增删改myisam_lock表数据阻塞
4 不可以增删改查其他表数据 可以增删改查其他表数据
5 释放myisam_lock的读锁 释放读锁同时阻塞的增删改成功

 

 

 

 

 

 

写锁(排它锁)

步骤 Session1 Session2
1 给myisam_lock加写锁  
2 可以查询myisam_lock表数据 查询myisam_lock表数据阻塞
3 释放myisam_lock的写锁 释放写锁同时阻塞的查询成功
4 给myisam_lock加写锁  
5 可以增删改myisam_lock表数据 增删改myisam_lock表数据阻塞
6 不可以增删改查其他表数据 可以增删改查其他表数据
7 释放myisam_lock的写锁 释放写锁同时阻塞的增删改成功

 

 

 

 

 

 

 

 

实践结束,我觉得有必要解释一下关于表锁的特点:

  • 表锁开销小,因为直接锁住整个表,不用太多查找,索引消耗的性能也比较小。
  • 加锁快,因为好找所以加锁时间也短。
  • 无死锁情况,因为MyISAM没有事务,所以就谈不上死锁。
  • 表锁粒度大,因为锁住所有表数据,这还不大吗?
  • 锁等待概率大,每次更新一下就要锁住表,所有增删改都需要排队。
  • 并发数较低,增删改都是排它锁,其他线程连访问都会阻塞,并发肯定低。
  • 一般用于查,因为查是共享锁,不影响其他线程读取,所以查的性能很好。

 

本文索引关键字:

读锁(共享锁):http://www.cnblogs.com/huanStephen/p/8067972.html#s_lock

写锁(排它锁):http://www.cnblogs.com/huanStephen/p/8067972.html#x_lock

欢迎大家索引!

posted @ 2017-12-19 22:03  huanStephen  阅读(369)  评论(0编辑  收藏  举报