MySQL高级开发 -- 表锁(MyISAM)

MySQL高级开发 – 表锁(MyISAM)

标签(空格分隔): MySQL


  • MySQL高级开发 表锁MyISAM
    • 什么是锁
    • 锁的分类及对比
      • 读锁
      • 写锁
    • 总结
    • 锁分析

什么是锁

锁是计算机协调多个进程或者线程并发访问某一个资源的机制。
在数据库中,除传统的计算资源(CPU,RAM,I/O等)的争用以外,数据也是一种供许多用户共享的资源,如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题。锁冲突也是影响数据库并发访问性能的一个重要因素,从这个角度来说,所对数据库尤其重要,也更加复杂。

锁的分类及对比

一、从操作类型上可以将锁分为:读锁和写锁

读锁

读锁(共享锁):针对同一份数据,多个读操作可以同时进行不会互相影响
MySQL高级开发 -- 表锁(MyISAM)_第1张图片

写锁

写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁
MySQL高级开发 -- 表锁(MyISAM)_第2张图片

总结

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作之前,会自动给涉及的表加写锁。
MySQL的表级锁有两种模式:
表共享读锁(Table Read Lock)
表独占写锁(Table Write Lock)
此处输入图片的描述
结合上表,所以对MyISAM表进行操作,会有一下情况:

1、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一个表的读请求,但会阻塞对同一个表的写请求,只有当读锁释放后,才会执行其他进程的写操作
2、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作

简而言之:读阻塞写,不阻塞读。写阻塞读和写
二、按照数据的细粒度来分,可分为,表锁、行锁、页锁
表锁:偏向于MyISAM存储引擎,开销小,加锁快;无死锁,锁定粒度大,发生冲突概率高。并发度小。
锁表命令:lock table tablename read,tablename2 write;
解锁命令:unlock tables;
查看锁:show open tables;

锁分析

可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的锁定情况

show status like 'table%';

这里有两个状态变量记录MySQL内部表级锁定的情况,两个变量说明如下:

table_locks_immediate:产生表级锁定的次数,表示可以立即获取所的查询次数,每立即获取锁值加1
table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,没等待一次加1)。此值越高说明存在较严重的锁争用情况。

此外:Myisam的读写锁调度是写优先,这也是myisam不适合做写为主的主表引擎。因为写锁后,其他线程不能做任何操作,大量更新会使查询很难得到锁,从而造成永远阻塞

你可能感兴趣的:(mysql)