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存储引擎的表级锁的更多相关文章

  1. 【MySQL】MySQL(四)存储引擎、索引、锁、集群

    MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...

  2. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

    注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...

  3. 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁

    转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...

  4. MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

  5. 【转】MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

  6. 转 MySQL中的行级锁,表级锁,页级锁

      对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...

  7. MySQL行级锁和表级锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  8. Mysql的行级锁与表级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...

  9. 详述 MySQL 中的行级锁、表级锁和页级锁

    转自:https://blog.csdn.net/qq_35246620/article/details/69943011 refer:cnblogs.com/f-ck-need-u/p/899547 ...

  10. Mysql的表级锁

    我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的.所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的.可根据不同的场景选用不同的锁定机制. ...

随机推荐

  1. CompletableFuture 测试类

    package com.example.apidemo.completableFutrue; import java.util.Random; import java.util.concurrent. ...

  2. vue Promise的使用

    一.Promise是什么? Promise是异步编程的一种解决方案. 二.那什么时候我们会来处理异步事件呢? 1. 一种很常见的场景应该就是网络请求了. 我们封装一个网络请求的函数,因为不能立即拿到结 ...

  3. C# 双向链表的实现

    类数据 public class Objects { private int number; /**//* 货物编号 */ private string name; /**//* 货物名称 */ pr ...

  4. java基础-构建工具mvn-day20

    目录 1. 初识mvn 2. 用maven创建工程 3. maven工程 之间的关系 4. 父子 mvn工程 5. mvn常见的插件 6. tomcat插件 1. 初识mvn mvn是一个项目构建工具 ...

  5. RLHF · PbRL | 速通 ICLR 2024 RLHF

    检索关键词:ICLR 2024.reinforcement learning.preference.human feedback. https://openreview.net/search?term ...

  6. 基于python的租房网站-房屋出租租赁系统(python+django+vue)

    该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品.欢迎大家提出宝贵建议. 功能介绍 平台采用B/S结构,后端采用主流的Python+Django进行 ...

  7. Laravel - 部署到万网虚拟主机 (2020年最新版本)

    一,在根目录下创建一个local文件夹,把网站根目录下除了public文件夹以外所有文件及文件夹剪切到local文件夹中然后把public文件夹下的所有文件剪切到网站根目录,接着删除public文件夹 ...

  8. window-子系统-ubuntu

    window-子系统-ubuntu 1. 背景 提供类Linux开发环境(命令行.文件系统.进程管理.网路) 2. 安装 A. wsl 安装 下载链接: https://wslstorestorage ...

  9. 【转帖】dl.google.com的国内镜像源

    dl.google.com不能访问 1.通过https://ping.chinaz.com/解析出dl.google.com的国内代理 2.C:\Windows\System32\drivers\et ...

  10. 【转帖】调教LLaMA类模型没那么难,LoRA将模型微调缩减到几小时

    https://www.thepaper.cn/newsDetail_forward_23250236 LoRA 微调方法,随着大模型的出现而走红. 最近几个月,ChatGPT 等一系列大语言模型(L ...