MyISAM存储引擎的表级锁
MyISAM存储引擎的表级锁
如果了解过文件锁的用法,那理解数据库锁就简单了。锁其实就协调多个进程或线程并发时,处理访问同一个资源的机制。在项目开发中,表锁是MySQL中作用范围较大的一种锁,它锁定的是用户操作的整张表,可以有效避免死锁的情况,且加锁速度快,消耗资源小。事情总有两面性,也就是因为表锁是锁了整张表,在并发的时候锁冲突更大,并发能力也就差
下面主要介绍MyISAM存储引擎的表级锁
一、表锁的分类
表锁根据操作的不同分为表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)
1、读锁
读锁表示用户读取数据(select)时添加的锁,此时不会阻塞其他用户对同一张表的读操作,但是会阻塞对同一张表的写请求
2、写锁
写锁表示用户对数据资源执行写(insert、update、delete)操作时添加的锁,此时除了当前添加写锁的用户外,其他用户都不能对表进行读、写操作,也就是说会阻塞其他用户对同一张表的读、写操作
MyISAM表的读操作与写操作,以及写操作之间是串行的
二、隐式的加锁
当用户操作select查询数据表时(MyISAM表),MySQL服务器会自动地为查询的表添加一个表读锁;当执行增删改(insert、delete、update)操作时,同样MySQL服务器也会自动地为操作的表添加一个表写锁;直到操作结束完毕,服务器为其自动解锁。
mysql> select * from order_step;
查询一张7万记录的表,注意表的存储引擎为MyISAM; 查询时间差不多3-5秒。此时新开一个终端,执行更新操作
mysql> update order_step set statusinner=2001 where stepid=75584;
// 等待上一个终端执行结束
留意:
隐式加锁的时候,表的更新操作优先级高于表的查询操作。在添加写锁时,若表中没有任何锁则添加,否则排队等待。在添加读锁时,若表中没有写锁则添加,否则也将排队等待
三、显示加锁
用户一般不需要直接用LOCK TABLE命令给MyISAM表显示加锁。我们为了学习,显示加锁来在一定程度模拟事务操作
LOCK TABLES 数据表名 READ [LOCAL] WRITE,....
1、创建MyISAM表,准备实验环境.
CREATE TABLE `user`(
id INT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50),
`money` DECIMAL(7,2)
)ENGINE=myisam CHARSET=utf8;
INSERT INTO user(`username`,`money`) VALUES('乔峰',5);
2、显式加表锁
终端A:在自己操作表的时候,不希望其他用户去修改这这个表的数据
mysql> use demo;
Database changed
mysql> show tables;
+----------------+
| Tables_in_demo |
+----------------+
| tab_innodb |
| user |
+----------------+
2 rows in set (0.00 sec)
mysql> lock tables user read;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+----+-----------+--------+
| id | username | money |
+----+-----------+--------+
| 1 | 乔峰 | 5.00 |
+----+-----------+--------+
1 rows in set (0.00 sec)
终端B
mysql> update user set money=money+5 where id=1;
// 等待终端A 释放锁
终端A 释放锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
3、支持并发时插入
在上面例子中,当终端A没有释放锁的时候,此时终端是不能update的,同时也不能insert。
mysql> insert into user(username,money) values('聂哥','100');
// 插入等待
考虑到并发的情况,我们在加锁的时候添加local选项。让其支持并发时插入
mysql> lock tables user read local;
Query OK, 0 rows affected (0.00 sec)
四、查询表级锁争用情况
mysql> show status like 'table%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Table_locks_immediate | 86 |
| Table_locks_waited | 0 |
| Table_open_cache_hits | 2 |
| Table_open_cache_misses | 0 |
| Table_open_cache_overflows | 0 |
+----------------------------+-------+
5 rows in set (0.01 sec)
Table_locks_waited 的值比较高,则说明存在着较严重的表级锁争用情况
MyISAM存储引擎的表级锁的更多相关文章
- 【MySQL】MySQL(四)存储引擎、索引、锁、集群
MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁
转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...
- MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 【转】MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 转 MySQL中的行级锁,表级锁,页级锁
对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...
- MySQL行级锁和表级锁
锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...
- Mysql的行级锁与表级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...
- 详述 MySQL 中的行级锁、表级锁和页级锁
转自:https://blog.csdn.net/qq_35246620/article/details/69943011 refer:cnblogs.com/f-ck-need-u/p/899547 ...
- Mysql的表级锁
我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的.所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的.可根据不同的场景选用不同的锁定机制. ...
随机推荐
- Python 在VSCode中使用
PyCharm到期了,所以打算换成VS Code(宇宙最好用编辑器?)试一试.但是下载之后不太会配置,网上不少的文章也比较旧了,所以打算自己看着官方教程配置一下.(VSCode版本:1.49.2,Py ...
- rem布局,使用手机端,pc大屏——亲测好用
1 var docEl = document.documentElement, 2 //当设备的方向变化(设备横向持或纵向持)此事件被触发.绑定此事件时, 3 //注意现在当浏览器不支持orienta ...
- C#排序算法4:希尔排序
希尔排序是插入排序的一种又称"缩小增量排序"(Diminishing Increment Sort),它是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...
- 浅谈 Docker 网络:单节点单容器
1.Docker 网络模型 Docker 在 1.7 版本中将容器网络部分代码抽离出来作为 Docker 的网络库,叫 libnetwork.libnetwork 中使用 CNM(Container ...
- NCC Mocha v0.10 发布, .NET 开发的基于 OpenTelemetry 的 APM 系统
目录 项目简介 项目进度 v0.10 发布内容 项目背景 平台功能 技术架构 v0.10 快速体验 启动项目 Trace 数据的发送 配置 Jaeger 数据源 Trace 数据的查询 项目简介 Mo ...
- Mongo库表占用空间统计
1. 背景 DBA同事反馈说Mongp集群磁盘占用空间过大,超过监控告警95%阈值,因此建议删除部分资源或者申请扩容,本着开源节流的理念,还是乖乖看哪些老数据应该删除.但Mongo中的库和表过多,因此 ...
- java - 递归排序 - 求数组最小值
// 递归求数组最小值 public class Bubble { // 定义存储最小值的变量 static int min; public static void main(String[] arg ...
- [转帖]新版 Elasticsearch 中的强悍插件 X-pack
https://zhuanlan.zhihu.com/p/36337697 3 人赞同了该文章 作者:Alan 岂安科技运维工程师努力踏上一条为后人留坑的运维之路.(逃 1 前言 Elk 日志可视 ...
- [转帖]【压测】通过Jemeter进行压力测试(超详细)
文章目录 背景 一.前言 二.关于JMeter 三.准备工作 四.创建测试 4.1.创建线程组 4.2.配置元件 4.3.构造HTTP请求 4.4.添加HTTP请求头 4.5.添加断言 4.6.添加察 ...
- [转帖]台积电3nm工艺细节曝光
https://weibo.com/ttarticle/p/show?id=2309404853901739557561&sudaref=www.baidu.com 2023年1月3日消息 ...