【数据库】聊聊MySQL事务隔离级别与锁机制

概述

针对事务来说,其实主要解决的就是数据的一致性,对于任何的存储中间件来说,都会存在并发访问数据的问题,编程语言层面 juc、go等机制 使用编程上的方式,加锁、无锁编程等。而数据库也存在多个连接访问修改同一个数据,那么是如何通过事务来保证数据的安全问题的?带着这个问题,我们来深入了解下。
其实本质上就是数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制机制。一整套的机制解决多事务并发问题。ACID只是一个理论模型。

事务

ACID特性

这个就不多说,分别是原子性、一致性、隔离性、持久性。
推荐阅读 -【分布式理论】聊一下 ACID、BASE、CAP、FLP

并发事务带来的问题

更新丢失、脏读、不可重复读、幻读。

隔离级别

在这里插入图片描述
常看当前数据库的事务隔离级别: show variables like 'tx_isolation';
设置事务隔离级别:set tx_isolation='REPEATABLE-READ'; Mysql默认的事务隔离级别是可重复读,用Spring开发程序时,如果不设置隔离级别默认用Mysql设置的隔 离级别,如果Spring设置了就用已经设置的隔离级别

锁是计算机协调多线程、进程访问同一共享资源的机制,可以保证数据安全。但是锁冲突也是影响数据库并发性能的一个因素。

锁分类

  • 性能:乐观锁、悲观锁
  • 数据库操作:读锁、写锁
  • 操作粒度:表锁、行锁

表锁

lock table 表名称 read(write),表名称2 read(write); // 手动增加表锁
show open tables; // 查看表上加过的锁
unlock tables;  // 删除表锁

【数据库之美】表锁演示

1、对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当 读锁释放后,才会执行其它进程的写操作。
2、对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进 程的读写操作

说白了就是,读读不互斥,读写互斥,写写互斥。表锁锁的粒度大,并发度低,锁冲突概率高,一般针对的是表数据迁移的场景

行锁

行锁,开销大,加锁慢,容易出现死锁,并发度高。MyIASM不支持行锁,InnoDB支持行锁。以及事务。

隔离级别演示

【数据库之美】脏读演示以及解决方案
【数据库之美】不可重复读演示及解决方案
【数据库之美】幻读演示及解决方案
死锁演示

间隙锁

间隙锁其实就是锁的两个值之间的间隙,MySQL默认是可重复读,间隙锁在某些情况下可以解决幻读问题。
在这里插入图片描述

那么锁的间隙(3,5),(5,10),(10,+∞)。这三个间隙。

在这里插入图片描述
如果一个session锁住一个区间,那么其他session没有办法在这个范围包含的所有行记录(包括间隙行记录)以及行记录所在的间隙插入或修改任何数据。

间隙锁是在可重复读隔离级别下才生效

临键锁 (next-key Locks)

Next-Key Locks是行锁与间隙锁的组合。(3,10] 整个区间叫做临键锁。

无索引的行锁会升级为表锁
锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁。
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁

lock in share mode(共享锁)for update 

会话1

mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> update tuser set name = 'qxlxiiii' where name = 'qxlxii';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> 

会话2

mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> update tuser set name = 'qxlxiiii' where name = 'qxlxiiii'; // 这里阻塞

锁分析以及优化

show status like 'innodb_row_lock%'‐‐ 查看事务select * from INFORMATION_SCHEMA.INNODB_TRX;‐‐ 查看锁select * from INFORMATION_SCHEMA.INNODB_LOCKS;‐‐ 查看锁等待select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;‐‐ 释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到kill trx_mysql_thread_id‐‐ 查看锁等待详细信息show engine innodb status\G;

Innodb_row_lock_current_waits: 当前正在等待锁定的数量 Innodb_row_lock_time: 从系统启动到现在锁定总时间长度 Innodb_row_lock_time_avg: 每次等待所花平均时间 Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花时间
Innodb_row_lock_waits:系统启动后到现在总共等待的次数

锁优化建议
尽可能所有数据检索都通过索引来完成,避免无索引行锁升级为表锁。
合理设计索引,缩小锁的范围。
尽可能减少检索条件范围,避免间隙锁。
控制事务大小,减少锁定资源量和时间长度,设计事务加锁的SQL放在最后执行。

留一个问题,在可重复读的情况下,是如何解决幻读问题。答案就是通过MVCC。这个我们下一篇文章讲解。

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

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

相关文章

远程开发之端口转发

远程开发之端口转发 涉及的软件forwarded port 通过端口转发,实现在本地电脑上访问远程服务器上的内网的服务。 涉及的软件 vscode、ssh forwarded port 在ports界面中的port字段,填需要转发的IP:PORT,即可转发远程服务器中的内网端口到本…

24校招,得物测试开发工程师一面

前言 大家好,今天我来回顾一下之前参加的得物-测试开发工程师第一次技术面试 面试官上来跳过实习和项目经历,直接开始八股拷打,最喜欢这种简单直接的了,太好玩了 过程 自我介绍用的什么语言? Python,来…

openssl3.2 - 官方demo学习 - cms - cms_dec.c

文章目录 openssl3.2 - 官方demo学习 - cms - cms_dec.c概述笔记END openssl3.2 - 官方demo学习 - cms - cms_dec.c 概述 对用证书加密的CMS数据进行解密(也需要加密时用的那个证书) 笔记 /*! \file cms_dec.c * \note openssl3.2 - 官方demo学习 - cms - cms_dec.c 对用证…

将图片添加到 PDF 的 5 种方法

需要一种称为 PDF 编辑器的特定工具才能将图片添加到 PDF。尽管大多数浏览器在查看和注释 PDF 文件方面都非常出色,但如果您使用图像到 PDF 技术,则只能将照片放入 PDF 中。无需修改即可将 PDF 文件恢复为原始格式的能力是使用此类软件程序甚至在线服务的…

Doris 数据分布—Bucket(Tablet)

Doris 数据分布—Bucket(Tablet) 分桶的意义在于极大减少了数据的扫描范围、提高了查询的效率* 在 Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行。各个 Tablet 之间的数据没有交集,并且在物理上是独立存…

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量(单例中会使用)3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

人机环境系统智能领域中的强度和角度

对于人工智能领域而言,强度和角度是两个重要的方面。 强度指的是人工智能技术的发展和应用程度。随着计算能力的提高和数据量的增加,人工智能在各个领域的应用正在不断增强。例如,深度学习和机器学习等技术的发展使得人工智能在图像识别、自然…

粒子物理和原子核物理的理论在模拟和分析电路中的粒子束和辐射效应中的应用

粒子物理和原子核物理的理论可以应用于模拟和分析电路中的粒子束和辐射效应,特别是在粒子加速器和辐射探测器的设计和优化方面。通过这些理论的应用,可以提高加速器和探测器的性能,推动粒子物理和原子核物理的研究进展。粒子物理和原子核物理…

OpenCV-24双边滤波

一、概念 双边滤波对于图像的边缘信息能够更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。 空间距离:指的是当前点与中心点的欧式距离。空间域的高斯函数及其数学形式为: 其中(xi,yi&…

记redis5.x在windows上搭建集群(六主六从)

六个运行端口 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 1、安装redis,文章太多不多BB 2、复制六份redis文件夹出来改名 3、修改每一份的配置文件 redis.windows.conf 修改为以下格式: #运行端口 port…

kubeSphere DevOps部署vue项目

devops部署vue项目 🌔环境说明🌏创建DevOps工程🌏填写流水线信息🌏创建流水线 🌔部署应用所需脚本JenkinsfileDockerfile 🌔脚本一些参数如何设置说明🌏deploy.yaml中的:imagePullSecrets:name属…

三、Qt Creator 使用

关于Qt的安装及环境配置,在我的上一篇《二、QT下载、安装及问题解决(windows系统)》已经讲过了。 本章节有一个重点,在新建 工程文件时,所在路径不要有中文,否则编译及运行程序不能正常运行。 在使用Qt Creator(以下…

【电源专题】案例:ADC有两个量程,为什么选小量程而不用大量程?

案例背景:早期其他产品设计使用大量程3V ADC,但是外部的分压配置最大电压分压后仅仅只到1.6V左右,无法用到3V ADC量程。其主要原因是供应商提供说越往大量程走误差值越大,但正常的设计应该是要达到接近满量程(如文章:【电子通识】案例:采用电阻分压式采样电压的设计注意…

[GN] nodejs16.13.0版本完美解决node-sass和sass-loader版本冲突问题

项目场景: npm install 运行vue项目时候 问题描述 项目场景:sass-loader ,node-sass出错 ! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: smoore-mes-web1.4.0 npm ERR! Found: webpack3.12.0 npm ER…

极简云源码已经开源

源码介绍 极简云已经开源 解绑卡密 查询卡密 总体来说还是很完善的 对接例子网盘里有 用户注册需要配置邮箱 上网页QQ邮箱标准版开启SMTP 然后生成授权码 后台发信邮箱里填就对了 实在不会配置邮箱的 可以下载网盘里的reg.php 把reg.php上传源码里的user目录 之后注册就不需要…

【操作系统】在阅读论文:OrcFS: Orchestrated file system for flash storage时需要补充的基础知

在阅读论文:OrcFS: Orchestrated file system for flash storage是需要补充的基础知识 这篇论文是为了解决软件层次之间的信息冗余问题 To minimize the disk traffic, the file system buffers the updates and then flushes them to the disk as a single unit, …

[脚本]油猴脚本简单入门

安装 科学上网后直接在谷歌商店安装 官方文档地址 文档地址 编写脚本 油猴自带的编译器非常不好用,不想麻烦配置编译器建议直接把内容拷贝到VSCode中进行编辑。 // UserScript // name New Userscript // namespace http://tampermonkey.net/ // v…

python爬虫02-requests库使用01

目录 1、requests库简介 2、requests库-安装 3、requests库-使用 3.1 导入模块 3.2 发送请求 3.3 requests库常用方法 3.4 访问控制参数kwargs 4、请求返回对象 Response 5、requests访问时的可能异常 1、requests库简介 requests是一个http的第三方请求库&#xff0…

Seata TC端协调全局事务

1、Seata server注册器 //来自RM分支事务注册 super.registerProcessor(MessageType.TYPE_BRANCH_REGISTER, onRequestProcessor, messageExecutor); //开启全局事务 super.registerProcessor(MessageType.TYPE_GLOBAL_BEGIN, onRequestProcessor, messageExecutor); //提交全…

QEMU源码全解析 —— PCI设备模拟(9)

接前一篇文章: 上一回介绍了虚拟机如何通过北桥的MMIO来读写PCI设备的配置空间。PCI设备的配置空间中有MMIO的地址,也就是BAR信息,里面存放有BAR的基址,虚拟机可以通过读写这些BAR来与设备通信。然而,QEMU在设备初始化…