【数据库】聊聊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,即可转发远程服务器中的内网端口到本…

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

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

[开发语言][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(以下…

[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, …

Seata TC端协调全局事务

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

crackmapexec工具详解

下载地址:https://github.com/Porchetta-Industries/CrackMapExec wiki:https://www.crackmapexec.wiki/ 1.安装(MAC) 1.1.python3.9 pipx 安装(运行软件有警告,推荐 python3.11 pipx 安装) …

记录下载安装rabbitmq(Linux) 并整合springboot--详细版(全)

下载rabbitmq(Linux): erlang压缩包: https://share.weiyun.com/TGhfV8eZ rabbitMq-server压缩包: https://share.weiyun.com/ZXbUwWHD (因为RabbitMQ采用 Erlang 实现的工业级的消息队列(MQ)服务器&#…

五、带登录窗体的demo

做了一个简单的带登录窗体的demo,有用户名和密码不能为空的验证,原理是在main.cpp的主函数入口处: 1、将默认的MainWindow主窗体注释。 2、新建一个formlogin登录窗体,在主函数中先运行登录窗体。 3、在登录窗体中引用MainWind…

杨中科 .NETCORE EFCORE 第一部分 基本使用

一 、什么是EF Core 什么是ORM 1、说明: 本课程需要你有数据库、SOL等基础知识。 2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库 比如插入: User user new User(Name"admin"Password"123”; orm.Save(user);比如查询: Book b…

mac上部署单体hbase

1. 简介 HBase 是一个开源的、分布式的、版本化的典型非关系型数据库。它是 Google BigTable 的开源实现,并且是 Apache 基金会的 Hadoop 项目的一部分1。HBase 在 Hadoop Distributed File System (HDFS) 上运行,作为一个列式存储非关系数据库管理系统…

Flutter之运行错误:this and base files have different roots

运行时报错: this and base files have different roots: E:\Demolpro\waqu\build\flutter-plugin-_android_lifecycle and C:\Users\78535\AppData\Local\Pub\Cache\hosted\pub.dev\flutter_pulgin_android_lifecycle-2.0.17\android 如图: 这种情况…

【JavaSE】P33~P113 方法,重载,数组,对象,构造器,this关键字,数组和对象的内存图,JavaBean

练习 1 方法方法定义及调用JShell简单使用(要求Java9以上)方法语句流程控制及注意事项选择循环 方法的重载 2 数组三种初始化方式数组在内存中的存储内存图 3 对象对象内存图Getter/Setter快捷写法this 关键字构造方法JavaBean的四个标准对象数组 二、编…

【数据结构】八大排序之计数排序算法

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.计数排序简介及思想 二.计数排序代码实现 三.计数排序复杂度分析 📌时间复杂度 📌空间复杂度 结语 一.计数排序简介及思想 计数排序(Cou…

Gitlab集成openLDAP统一认证登录

vim /etc/gitlab/gitlab.rb, 可以配置很多个server,因此与sssd服务一样可以配置多个ldap作为高可用 gitlab-ctl reconfiguregitlab-rake gitlab:ldap:checkgitlab-ctl restart gitlab-rake gitlab:ldap:check Checking LDAP ...LDAP: ... Server: ldapm…