mysql的锁机制
Posted 健康平安的活着
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的锁机制相关的知识,希望对你有一定的参考价值。
一 mysql的锁
1.1 锁的概念
锁是计算机协调多个进程或线程并发访问某一资源的机制。
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
1.2 锁的分类
从对数据操作的类型
- 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
- 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
从对数据操作的粒度分
- 表锁
- 行锁
1.3 表锁
1.3.1 表锁的特点
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
1.3.2 上锁的过程
lock table 表名字 read(write), 表名字2 read(write), 其他;
1.3.3 查看表加过的锁
show open tables;
1.3.4 释放表加过的锁
unlock tables;
1.4 表锁的案例
1.4.1 案例情况
情况1:如果A加了读锁
A可以查自已的表,但不能更新或者增加自已的表数据,不能查看其他表的数据。
B可以查A的表,但不能更新或者增加A的表数据(会阻塞),直到A释放了读锁,直到A释放锁,B才可以修改不然就一直阻塞。
情况二:如果A加了写锁
A可以查自已的表,也可以更新或者添加自已的表数据。
B不可以查A的表,也不能更新或者增加A的数据(会阻塞),直到A释放了写锁
1.4.2 结论
对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
对MyISAM表的写操作〈加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
简而言之:就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞。
此外,MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。
Mysql中各类锁的机制图文详细解析(全)_码农研究僧的博客-CSDN博客
1.5 表锁
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁
以上是关于mysql的锁机制的主要内容,如果未能解决你的问题,请参考以下文章