Mysql的锁问题:

news2024/12/27 20:05:01

Mysql的锁问题:

1.1锁的概述:

​ Mysql锁的机制比较简单,不同的存储引擎支持不同的锁机制:MyISAM和MEMORY存储引擎支持表级锁;DBD支持页面锁,但是它也支持表级锁;InnoDB既支持行级锁也支持表级锁,但是默认情况下支持行级锁;

​ 表级锁:开销小

1.2MyISAM表锁:

1.2.1 查询表锁争用情况:
	mysql> SHOW STATUS LIKE 'table%';

​ ±---------------------------±------+
​ | Variable_name | Value |
​ ±---------------------------±------+
​ | Table_locks_immediate | 7 |
​ | Table_locks_waited | 0 |
​ | Table_open_cache_hits | 0 |
​ | Table_open_cache_misses | 0 |
​ | Table_open_cache_overflows | 0 |
​ ±---------------------------±------+
Table_locks_waited 的值比较高,就说明存在着比较严重的表级锁竞争;

1.2.2 MYSQL表级锁的锁模式:

​ 表共享读锁(Table Read Lock)

​ 表独占写锁(Table Write Lock)

​ MySAM 表的读操作,不会塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM 表的写操作,则会阻塞其他用户对同一表的读和写操作;
MyISAM 表锁的读操作与写操作之间,以及写操作之间是串行的,当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读操作都会等待,直到锁被释放为止。

1.2.3 如何加表锁:

​ MyISAM 在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT 等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用 LOCK TABLE 命令给 MyISAM 表显式加锁。

​ 给 MyISAM 表显式加锁,一般是为了在一定程度模拟事务操作,实现对某一时间点多表的一致性读取。

​ 什么是显示加锁:指的是把 Lock table table_name read 的加锁命令写出来;

​ 代码示例:

​ 1、当我用命令行链接数据库时候模拟session1用户,用Navicat链接作为session2用户;

​ session1进行写锁定,session2进行读操作可以看第一截图,session明显是阻塞在那了。
在这里插入图片描述

当session1立即释放锁后,session2立马拿到了读操作得结果;
在这里插入图片描述

锁之间的读写阻塞的关系大家可以在找个环境多试试一下,这里就不过多的演示了。

1.2.4 并发插入:(Councurrent Insert):

​ MyISAM 表的读和写是串行的,但这是就总体而言的。在一定条件下,MyISAM表也支持查询和插入操作的并发进行。MyISAM 存储引擎有一个系统变量 concurrent insert,专门用以控制其并发插人的行为其值分别可以为 0、1或 2。

​ 当concurrent insert设置为0时,不允许并发插入

​ 当concurrent insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被册除的行),MyISAM 允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySOI的默认设置(or Auto)。
​ 当concurrent insert设置为 2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。

​ 可以利用 MyISAM 存储引擎的并发插人特性来解决应用中对同一表查询和插人的锁争用,例如将 concurrent_insert 系统变量设为 2总是允许并发插人;同时,通过定期在系统空闲时执行 OPTIMIZE TABLE 语句来整理空间碎片,收回因删除记录而产生的中间空洞。

1.2.5 锁调度:

​ MyISAM 存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么一个进程请求某个MyISAM 表的读锁,同时另一个进程也请求同一表的写锁,MySQL 如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为 MySQL 认为写请求一般比读请求要重要。这也正是 MyISAM 表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。不过我们可以通过一些设置来调节 MyISAM 的调度行为。

​ ● 通过指定启动参数 low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。
​ ● 通过执行命令SETLOW PRIORITY UPDATES=1,使该连接发出的更新请求优先级降低。
​ ● 通过指定INSERT、UPDATE、DELETE 语句的 LOW_PRIORITY 属性,降低该语句的优先级。
虽然上面 3 种方法都是要么更新优先,要么查询优先的方法,但还是可以用其来解决查询相对重要的应用(如用户登录系统 )中读锁等待严重的问题。

另外,MvSOL 也提供了一种折中的办法来调节读写冲突,即给系统参数 max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL 就暂时将写请求的优先级降低,给读进程一定获得锁的机会。

max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL 就暂时将写请求的优先级降低,给读进程一定获得锁的机会。

​ 这里还要强调一点:一些需要长时间运行的查询操作,也会使写进程“饿死”! 因此,应用中应尽量避免出现长时间运行的询操作,不要总想用一条 SELECT 语来解决问题,因为这种看似巧妙的 SQL 语句,往往较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对 SQL 语句做一定的“分解”,使每一步查询都能在较短时间完成,从而减少锁冲突。如果复杂查询不可避免,应尽景安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

23-1-18 文件上传

步骤 file01 / file02 分别是两台java服务 功能: 主要负责接收用户上传的文件存储在指定目录 并记录(上传时间、上传人、文件信息(大小,源文件名,存储后的文件名 ....) 文件权限(共享、私有))。负责接收处理用户的下载请求,用户可以根据文件…

【开发Log】C++QT连连看

1.10开发的初衷是闲来无事开了把宠物连连看,然后发现打了几遍第一关都过不去,于是想自己写个,这样就可以任意使用提示次数了(bushi。其实今天正好是老妈生日,问了下老妈她竟然还玩连连看,还ak了orz。于是乎…

分布式理论

目录 1.定义 2.关键技术 3.关键问题 4.基本定理 4.1.CAP定理 4.2.BASE定理 1.定义 分布式的本质是一系列计算机集群通过网络共同完成一串连贯的任务。 2.关键技术 分布式主要关注的几个关键点技术是: 性能容错通信 性能: 可扩展性&#xff0c…

深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数

想要入门深度学习的小伙伴们,可以了解下本博主的其它基础内容: 🏠我的个人主页 🚀深度学习入门基础CNN系列——卷积计算 🌟深度学习入门基础CNN系列——填充(padding)与步幅(stride&…

Acwing - 算法基础课 - 笔记(数学知识 · 三)(补)

数学知识(三) 这一小节讲的是高斯消元,组合数。 高斯消元 高斯消元是用来解方程的,通常来说可以在 O(n3)O(n^3)O(n3) 的时间复杂度内,求出包含 n 个未知数的,n个方程的多元线性方程组的解。如下的方程组…

人机界面石油行业应用:一个设备构建石油罐区状态监测系统

一、应用背景 石油罐区是石油石化企业重要的生产设施,负责存储和输送各类油品,而石油罐区状态参数的监控是生产管理的重要部分,不仅可以及时准确地获取现场设备数据,保证罐区的正常运行,还可以防止安全事故的发生。 …

Python如何解决“快手滑块验证码”(4)

前言 本文是该专栏的第32篇,后面会持续分享python的干货知识,记得关注。 很多时候,我们打开一个页面还没开始进行浏览,就跳出一个滑块验证的图片,需要拖到滑块至缺口处,才可以正常浏览。这对于我们正常人浏览页面来说,几乎没什么难度,但是当我们需要用到脚本去实现的时…

本地服务器如何让外网远程桌面连接?

远程访问是远程办公和服务器管理常用的网络应用场景。那么,当我们需要面对远程目标主机是内网服务器电脑时,在不是同个局域网的跨网环境下,内网可以远程控制电脑吗?答案是可以,使用快解析内网映射方案就能实现将本地服…

MyBatis一级缓存 二级缓存

MyBatis一级缓存 二级缓存什么是缓存?一级缓存一级缓存失效的四种情况二级缓存怎样开启二级缓存使二级缓存失效的情况二级缓存相关配置缓存查询的数据顺序整合第三方缓存EHCache(代替二级缓存)什么是缓存? 这是一个地图软件上的根据城市查询模块,对于那…

Freemarker页面静态化开发

4.5 页面静态化 4.5.1 什么是页面静态化 根据课程发布的操作流程,执行课程发布后要将课程详情信息页面静态化,生成html页面上传至文件系统。 什么是页面静态化? 课程预览功能通过模板引擎技术在页面模板中填充数据,生成html页…

Mybatis Plus轻松上手

Mybatis Plus 今日目标: 了解mybatisplus的特点能够掌握mybatisplus快速入门能够掌握mybatisplus常用注解能够掌握mybatisplus常用的增删改查能够掌握mybatisplus自动代码生成 Mybatis: ✔需要程序员编写sql语句程序员可以干预sql对sql进行调优(优化) MybatisPlu…

强化学习笔记:基于价值的学习方法之价值估计(python实现)

目录 1. 前言 2. 数学原理 3. 代码实现 3.1 游戏设定 3.2 class State 3.3 class Action 3.4 Class Agent 3.5 Class Environment 4. 仿真结果及其分析 4.1 play() 4.2 value_evaluation_all_states(grid, max_steps) 4.3 value_evaluation_one_state(grid, s) 4.4…

ZYNQ FPGA嵌入式开发 - 小梅哥(二)

创建工程打开Xilinx SDK创建工程Next 创建Empty Application添加文件编写代码参考文档 UG585 Zynq 7000 Technical Reference Manual寄存器说明 Appx.B: Registe Detial查看帮助文档Import Examples跨平台使用:头文件:unistd.h 每个平台都会提供sleep() …

论文阅读笔记:Attention is All You Need

论文标题:Attention is All You Need 目录 论文标题:Attention is All You Need 1.摘要 2.前言 3.模型结构 自注意力机制 多头自注意力机制 注意力机制在Transformer中的应用 1.摘要 过去最优的模型是带有attention连接的encoder-decoder模型&…

string的应用和模拟实现(上)

目录 string的应用 insert插入元素 erase删除元素 assign赋值: replace代替函数的一部分 find:从string对象中找元素 c_str:得到c类型的字符串的指针 substr:取部分元素构建成新的string对象 rfind find_first_of:从string查找元素 stri…

JVM【类的加载过程(类的生命周期)详解】

概述 在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。 按照 Java 虚拟机规范,从 class 文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如…

软件测试之python学习

1、pycharm的常用配置 1.1修改主题配置 1、点击菜单file,选择settings选项2、选择editor,点击color scheme配色方案3、在右侧选择对应的主题配置1.2修改背景颜色 1、点击菜单file,选择settings选项2、选择appearance,点击Theme 1.3调整字体大小 1、点…

基于K8S+eureka的java应用快速上下线的WEB平台

刚进公司时,由于历史原因,应用发布通过:发布新版(新老并存)->下线老版->删除老版的方式,每次通过手工处理,蛋疼(不方便且高风险)。于是马上写了比较直观的脚本方案…

关于java移位运算的一点讨论

框架乱飞的年代,时常还得往框架源码里看,对内在原理没点理解,人家就会认为你不太行。平时开发你可能没咋用过位移运算,但往源码里一看,就时常能看到它。我也是看着看着,突然仔细一琢磨,又不由得…

C++缺省参数与函数重载

目录 一.缺省参数 1. 基本概念 2.多参函数中使用缺省参数的情形分类 二.函数重载 (1)形参类型不同构成的重载 (2)形参个数不同构成的重载 (3)形参类型顺序不同构成的重载 函数重载的注意事项: 三.C支持函数重载的底层原理--函数名修饰 编译器生成可执行程序…