MySQL中的读锁和写锁

2023-11-07

MySql锁

(数据库都是悲观锁,java、redis、zookeeper会有乐观锁)

锁的概念

MySQL中的锁

MyISAM

      MyISAM共享读锁

      MyISAM独占写锁

      MyISAM锁调度

InnoDb

      InnoDb行锁

      InnoDb表锁

 

锁的概念

  1. 锁是计算机协调多个进程或线程并发访问某一资源的机制。
  2. 在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
  3. 锁对数据库而言显得尤其重要,也更加复杂。

MySQL中的锁

  1. MySQL的锁机制比较简单
  2. 其最显著的特点是不同的存储引擎支持不同的锁机制
  3. 比如:
  4. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
  5. InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

 

MySQL中的锁

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

 

仅从锁的角度来说:

表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如OLAP系统

行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适

MyISAM的表锁

MySQL的表级锁有两种模式:

表共享读锁(Table Read Lock)

表独占写锁(Table Write Lock)

读的时候可以读,读的时候不能写,写的时候不能读,写的时候不能写(读就是共享读,其他的可以读,不能写,写是独立写,其他的不能读也不能写)

 

MyISAM的表锁-共享读锁

1. lock table testmysam READ  启动另外一个session   select * from testmysam 可以查询

2. insert into testmysam value(2);

    update testmysam set id=2  where id=1; 报错

3.在另外一个session中

    insert into testmysam value(2);  等待

4.在同一个session中

   insert into testdemo  value(2,'2','3'); 报错

   select  * from testdemo  ; 报错

5.在另外一个session中

   insert into testdemo  value(2,'2','3'); 成功

6.加索在同一个session 中 select s.* from  testmysam s 报错 

    lock table 表名 as 别名 read;

查看 show status LIKE 'table_locks_waited'  表被锁过几次

 

MyISAM的表锁-独占写锁

 

1.lock table testmysam WRITE

 在同一个session中 

   insert testmysam value(3);

  delete from testmysam where id = 3

  select * from testmysam

2.对不同的表操作(报错)

select s.* from  testmysam s

insert into testdemo  value(2,'2','3');

3.在其他session中 (等待)

select * from testmysam                 

MyISAM的表锁

总结

  1. 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求
  2. 对MyISAM表的读操作,不会阻塞当前session对表读,当对表进行修改会保存
  3. 一个session使用LOCK TABLE命令给表f加了读锁,这个session可以查询锁定表中的记录,但更新或访问其他表都会提示错误;
  4. 另外一个session可以查询表中的记录,但更新就会出现锁等待
  5. 对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;
  6. 对 MyISAM表的写操作,当前session可以对本表做CRUD,但对其他表进行操作会报错

 

InnoDb行锁

在mysql 的 InnoDB引擎支持行锁

行锁:

  1. 共享锁又称:读锁。当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。
  2. 排它锁又称:写锁。当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。包括写锁。

 

语法

      上共享锁的写法:lock in share mode

      例如: select  *  from where  条件  lock in share mode

      上排它锁的写法:for update

      例如:select *  from   where 条件 for update

1.

BEGIN

select * from testdemo where id =1 for update

在另外一个session中

update testdemo set c1 = '1' where id = 2 成功

update testdemo set c1 = '1' where id = 1 等待

2.

BEGIN

update testdemo set c1 = '1' where id = 1

在另外一个session中

update testdemo set c1 = '1' where id = 1 等待

3.

BEGIN

update testdemo set c1 = '1' where  c1 = '1'

在另外一个session中

update testdemo set c1 = '2' where  c1 = '2' 等待

 

注意:

1.两个事务不能锁同一个索引。

2.insert ,delete , update在事务中都会自动默认加上排它锁。

3.行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。

4. InnoDb表锁和MyISAM差别不大 。注意:开启一个新事务的时候会解锁表

innodb行级锁

写锁:写不同数据可以,同条数据等待

用commit和rollback

 

表锁不用begin,表锁不用commit和rollback释放

 

开启一个新事物的时候,自动引用unlock()

 

 

 

面试题:系统运行一段时间,数据量已经很大,这时候系统升级,有张表A需要增加个字段,并发量白天晚上都很大,请问怎么修改表结构

面试考点:(修改表结构会导致表锁,数据量大修改数据很长,导致大量用户阻塞,无法访问!)

1. 首先创建一个和你要执行的alter操作的表一样的空的表结构。

2. 执行我们赋予的表结构的修改,然后copy原表中的数据到新表里面。

3. 在原表上创建一个触发器在数据copy的过程中,将原表的更新数据的操作全部更新到新的表中来。

4. copy完成之后,用rename table 新表代替原表,默认删除原表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL中的读锁和写锁 的相关文章

  • 不同的数据库使用不同的名称引用吗?

    例如 mysql引用表名使用 SELECT FROM table name 注意 其他数据库是否使用不同的字符来引用其表名 这种引号的使用称为分隔标识符 它是 SQL 的重要组成部分 因为否则您将无法使用以下标识符 例如表名和列名 包含空格
  • 检查 MySQL 和 PHP 中是否都存在 ids 列表

    最有效的方法是什么MySQL and PHP检查 id 列表是否全部存在 我希望函数返回结果是true if allid 存在 否则false 我刚在想 ids array 2233 5545 9478 5343 3545 do all g
  • 在php中循环多维数组并执行mysql插入(股票数据)

    我有一个多维数组 我希望循环遍历它并为数组中的值执行 mysql 数据库插入 我需要插入到 sql 查询中的数组值是 candles 0 complete candles 0 volume candles 0 mid h candles 0
  • 高级 MySQL:查找民意调查响应之间的相关性

    我有四个 MySQL 表 users 身份证号 姓名 polls ID 文本 options id poll id 文本 回应 id poll id 选项 id 用户 id 给定一个特定的民意调查和一个特定的选项 我想生成一个表格 显示其他
  • 如何在MySQL查询结果中显示序号

    我有一些简单的查询 SELECT foo bar FROM table 我想你现在的结果是什么样的 我想要做的是根据查询结果中出现的数据数量来显示一些序列号 就像AUTO INCREMENT 这并不意味着我想出示身份证 我想要的结果是这样的
  • 如何检查 .sql 文件中的 SQL 语法?

    如何检查 sql 文件中的 SQL 语法 SELECT STATEMENT DIGEST TEXT在MySQL 8 0中可以用于MySQL查询语法验证 8 0 4 gt SELECT STATEMENT DIGEST TEXT FLUSH
  • 在MySQL中永久设置auto_increment_offset

    我以 root 身份运行命令 set auto increment offset 2 但从其他连接上看不到效果 为什么不 它是全球性的 From http dev mysql com doc refman 5 1 en replicatio
  • Mysql 中的 MD5 和 Salt

    如何 解密 各种电商存储的密码添加 盐 我不是密码专家 所以 在过去 我使用过类似的东西 SELECT FROM mytable WHERE email email AND passwd MD5 pwd MySql MD5 函数只接受一个参
  • Node.js - 我可以在 PhoneGap / Cordova 应用程序上安装 NPM 包吗?

    感谢 Cordova 我正在构建一个移动应用程序 并且由于 Cordova 基于 Node js 我认为我可以在应用程序中使用 NPM 包 例如 我希望我的移动应用程序能够与远程 MySQL 数据库通信 我想我可以使用 mysql NPM
  • InnoDB vs. MyISAM 插入查询时间

    我有一个大型 MySQL 表 约 1000 万行 6 5G 用于读取和写入 它是MyISAM 由于MyISAM 的所有表写入锁 我获得了很多锁 我决定尝试迁移到 InnoDB 推荐用于读 写表 它只锁定写入时的特定行 转换后 我测试了插入语
  • 无法将代码优先迁移应用到 mysql 数据库

    我正在使用 EF 代码优先模型开发 asp net mvc 我正在尝试首先使用 EF 代码将迁移应用到我的项目中 我正在使用 MySql 数据库 目前我使用的是 EF 4 3 1 版本和 6 6 4 0 版本的 mysql Connecto
  • MySQL 无法使用 PHP 连接到本地主机上的服务器

    我正在使用 XAMPP 1 7 2 可以通过 cmd 和 SQLYog 连接到 MySQL 但不能以编程方式连接 这段 PHP 代码 conn mysql connect localhost root if conn die Could n
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • 使用存储过程并发访问MySQL数据库

    我有一个存储过程 它将读取然后增加数据库中的值 许多程序同时使用这个特定的过程 我担心并发问题 特别是读写器问题 有人可以建议我任何可能的解决方案吗 thanks 首先 正如另一篇文章中所述 使用 InnoDB 从 MySQL 5 5 开始
  • 提交ajax表单并停留在同一页面不起作用

    我想将用户的评论存储在我的数据库中 当用户提交时 我不想将他们重定向到新页面 我有以下代码 但它不起作用 我的 HTML 代码
  • 保存用户的身高和体重

    我应该如何将用户的身高和体重存储在MySQL数据库中 以便我可以使用这些信息来查找特定身高或体重内的用户 另外 我需要能够以英制或公制显示此信息 我的想法是存储以厘米为单位的身高和以公斤为单位的体重信息 我更喜欢公制而不是英制 我什至可以让
  • 为什么在 MAC OSX 上编译简单的 mysql c 应用程序时不断收到未定义的符号?

    我正在使用 MACOS 并尝试编写一个 测试 mysql 应用程序 该应用程序仅测试与本地数据库的连接 include
  • MySQL 中如何使用继承?

    所以我正在读一本关于数据库设计原理的书 并读到了有关继承的章节 但我对如何在 MySQL 中将子类与其超类 连接 感到困惑 The table structure would for example look like this 那么我如何
  • 如何获取mysql中一条记录的大小

    如果表包含 TEXT 或 BLOB 类型的字段 如何获取 MySql 中记录的大小 是否可以使用sql语句获取记录或表的大小 要计算字符串或 blob 的大小 以字节为单位 请使用LENGTH YourColumn http dev mys
  • 无法在 Centos 上安装 php-mysqli 扩展

    我正在尝试将 mysqli 扩展安装到 php yum install php mysqli 我收到下一个错误 Transaction Check Error file usr share mysql charsets Index xml

随机推荐

  • 我使用OpenCvSharp的一些坑,我的使用心得

    首先是关于 copyto 的操作郁闷 资源图片 需要 是正方形 或者 宽 大于高经我测试 长宽 大小的情况 还是需要跟背景有相应的一致性 比如如果背景 是长大于宽 则资源文件 也需要长大于宽 反之亦然 正方形的图片 则无此要求 要比背景图片
  • Mybatis高级映射

    Mybatis高级映射本质上来说是多个表的联合查询过程 订单数据模型分析思路 数据表 用户表user 记录了购买商品的用户信息 订单表orders 记录了用户创建的订单 购买商品的订单 订单明细表orderdatail 记录了订单的详细信息
  • 玩转Netty,从“Hello World”开始

    大家好 我是老三 之前里 我们讨论了Java的三种IO模型 提到了网络通信框架Netty 它简化和优化了NIO的使用 这期 我们正式开始走近Netty 为什么要用Netty 首先当然是NIO的使用 本身比较复杂 而且还存在一些问题 除此之外
  • Ubuntu 软件包管理详解

    Ubuntu 软件包管理详解 Ubuntu 方便宜用 最值得让人称道的便是其安装软件的方式 一条命令 sudo apt get install xxx 就几乎能帮你搞定所有的软件安装难题 但是有时你可能有这样的需求 查看某个软件包是否安装
  • 使用Object.setPrototypeOf()设置对象的原型

    此方法可以设置对象的原型 Object setPrototypeOf方法是针对对象实例的 而不是构造函数 类 此方法修改的是对象实例的内部属性 prototype 也就是 proto 属性所指向的对象 它只是修改了特定对象上的原型对象 对于
  • Unity中,实现鼠标点击物体,触发事件

    对于UI 很容易能够实现鼠标点击 从而触发事件 但是对于游戏中的物体 则需要多进行一些操作 原理很简单 就是由鼠标点击处发射线 与游戏物体发生碰撞 碰撞到的物体 就是你点击到的物体 具体操作如下 对你的Camera 摄像机 添加 Physi
  • python基础(三)

    模块相关基础 1 1模块的格式 usr bin env python3 coding utf 8 这是一个注释 author lnssm import sys def test args sys argv if len args 1 pri
  • uView 2.0 http请求封装基本使用

    uview2 0 http封装 根据官网填写即可 注意你的路径跟官网的不一样需要改动 网址 https www uviewui com js http html 封装过程 此处示范的是get请求 新建src config request j
  • Bandicam v6.2.4.2083 班迪录屏软件解锁VIP中文便携版

    4K超清屏幕录像 Bandicam 绿色正式版已集成授权信息 自动屏蔽联网验证授权 启动即为已授权版 无试用版任何的限制 录制时间没限制 录制大于十分钟的视频没有水印 最好用的电脑录屏软件 Bandicam班迪录屏 Bandicam 班迪录
  • 设计模式——Go语言(Golang)版:23_访问者模式

    1 介绍 表示一个作用于某对象结构中的各元素的操作 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 访问者模式 Visitor 是一种操作一组对象的操作 它的目的是不改变对象的定义 但允许新增不同的访问者 来定义新的操作 访
  • 【C语言】杨氏矩阵

    题目描述 有一个数字矩阵 矩阵的每行从左到右是递增的 矩阵从上到下是递增的 请编写程序在这样的矩阵中查找某个数字是否存在 要求 时间复杂度小于O N 思路1 可以采用遍历方式一个个查找 但是这样时间复杂度为O N 不满足题目要求 思路2 先
  • onedrive同步任意文件夹

    需求描述 想要通过onedrive同步备份一个工作文件夹 依次打开OneDrive 设置 备份 管理备份 发现默认只能备份特定的文件夹 如下所示 而我只想备份文档中的一个子文件夹 OneDrive默认5G空间 应该够了 解决办法 1 以管理
  • 30个jQuery按钮悬停动画

    超炫酷的30个jQuery按钮悬停动画 1 028 人浏览 发表回复 按钮插件是最常见的jQuery插件之一 因为它用途广泛 而且配置起来最为方便 今天我们要分享的是30个超炫酷的jQuery悬停按钮动画 当我们将鼠标滑过按钮时 按钮的背景
  • 组网方案设计,运用Mesh组网实现无缝漫游!

    在当今社会 无线网络已经成为了人们在工作 学习 娱乐生活中必不可少的一部分 但一台路由器的信号范围是有限的 随着距离的增加就会出现信号变弱导致的网速慢 网络卡顿甚至断网的情况 所以在一些面积较广 障碍较多 结构较复杂的场景下就需要安装两个乃
  • 彻底搞懂Java的等待-通知(wait-notify)机制

    线程的生命周期转换 新建状态 New 新建一个线程对象 就绪 可运行状态 Runnable 线程对象创建后 其他线程调用了该对象的start方法 该状态的线程位于可运行线程池中 变得可运行 等待获取CPU的使用权 运行状态 Running
  • python读取openapijson文件所有接口信息

    import openpyxl import json from apistar schemas import OpenAPI with open r E 下载 default OpenAPI json r encoding utf 8 a
  • JAVA string类型的年月日期获取前一个月日期

    废话不多说 代码如下 String date 2023 01 SimpleDateFormat simpleDateFormat new SimpleDateFormat yyyy MM Date newdate simpleDateFor
  • 各种开源协议介绍

    各种开源协议介绍 BSD Apache Licence GPL V2 GPL V3 LGPL MIT 原文连接 https www open open com bbs view 1319816219625
  • C#中的变量祥解

    一 C 数据类型 A 值类型 值类型变量可以直接分配一个值 它是从System ValueType派生而来 值类型直接包含数据 比如int char float 他们分别存储整型数据 字符 浮点数 当你申明一个值类型时 系统分别空间来存储值
  • MySQL中的读锁和写锁

    MySql锁 数据库都是悲观锁 java redis zookeeper会有乐观锁 锁的概念 MySQL中的锁 MyISAM锁 MyISAM共享读锁 MyISAM独占写锁 MyISAM锁调度 InnoDb InnoDb行锁 InnoDb表锁