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

news2025/4/24 4:06:17

概述

针对事务来说,其实主要解决的就是数据的一致性,对于任何的存储中间件来说,都会存在并发访问数据的问题,编程语言层面 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.coloradmin.cn/o/1382430.html

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

相关文章

KEI5许可证没到期,编译却出现Error: C9555E: Failed to check out a license.问题解决

一、编译出现如下报错 二、检查一下许可证 三、许可证在许可日期内,故应该不是许可证的问题 四、检查一下编译器,我用的是这个,这几个编译器的区别其实我不太明白,但我把问题解决是选的这个 五、找到编译器的路径,去复…

metrics安装异常原因【doesn‘t contain any IP SANs】

1、问题背景 安装好k8s后,安装metrics-server后发现对应的pod一直无法启动。 apiVersion: v1 kind: ServiceAccount metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: Cl…

windows下如何搭建Yapi环境

今天使用YApi时发现原网址无法访问。这下只能本地部署了(官方文档)。 第一步:安装node.js 获取资源 nodejs: https://nodejs.org/en/downloadLinux安装yum install -y nodejs查看node版本node -v查看npm版本npm -v第二步:安装mo…

Redis命令 - Hashes命令组常用命令

1、HSET key field value 设置 key 指定的哈希集中指定字段的值。 HSET key field value 返回值:1代表field是一个新的字段。0代表field已存在 如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段在哈希集中存在,它将…

【算法】最佳牛围栏(二分,前缀和,双指针)

题目 农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。 围起区域内…

9. 乐观锁

当程序中出现并发访问时,就需要保证数据的一致性。以商品系统为例,现在有两个管理员均想对同一件售价为 100 元的商品进行修改,A 管理员正准备将商品售价改为 150 元,但此时出现了网络问题,导致 A 管理员的操作陷入了等…

大括号内两行公式中,如何左对齐公式的条件

1. 先建立一个大括号,中间设置一个二维矩阵如下: 2. 选中整个矩阵,不要选外面的括号,进行如下操作 3. 选择左侧对齐 即可。

浅析Linux进程地址空间

前言 现代处理器基本都支持虚拟内存管理,在开启虚存管理时,程序只能访问到虚拟地址,处理器的内存管理单元(MMU)会自动完成虚拟地址到物理地址的转换。基于虚拟内存机制,操作系统可以为每个运行中的进程创建…

YOLOv8原理与源码解析

课程链接:https://edu.csdn.net/course/detail/39251 【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来!代码阅读是从基础到提高的必由之路。 YOLOv8 基于先前…

linux多进程基础(3):waitpid()函数

前文已经讲解了wait函数,这一篇要讲的是waitpid()函数. waitpid()函数与wait()函数目的一致:回收子进程资源,但它比 wait() 更灵活,其可以指定要等待的子进程的 PID(进程ID),并且可以设置函数是阻塞还是非阻塞的,当设置为非阻塞的,主函数将不再等待子函…

Dobbo---分布式系统通信方式

通信方式 分布式系统通信方式1. RMIRMI 通信实现案例2. RPC常用RPC框架 分布式系统通信方式 1. RMI RMI ( Remote Method Invocation 远程方法调用) 图1.1 客户端-服务端通信方式 客户端将要调用的方法及参数,打包为辅助对象,通过网络socket&#xff…

【CAN】CANoe添加模拟节点报错解决方法

文章目录 1. 问题现象2. 问题解决方法 >>返回总目录<< 1. 问题现象 通过CANoe添加模拟节点时&#xff0c;提示无法加载动态链接库CANOEILNLSPA.DLL。 2. 问题解决方法 右键模拟节点&#xff0c;选择Configuration选项&#xff0c;弹出Node Configuration界面&am…

Vue.observable详解(细到原码)

文章目录 一、Observable 是什么二、使用场景三、原理分析参考文献 一、Observable 是什么 Observable 翻译过来我们可以理解成可观察的 我们先来看一下其在Vue中的定义 Vue.observable&#xff0c;让一个对象变成响应式数据。Vue 内部会用它来处理 data 函数返回的对象 返回…

JS数组函数 reduce() 的用法—包含基础、进阶、高阶用法

目录 一、语法剖析 二、实例讲解 1. 求数组项之和 2. 求数组项最大值 3. 数组去重 三、其他相关方法 1. reduceRight() 2. forEach()、map()、every()、some()和filter() 四、重点总结 先看w3c语法 ✔ 常见用法 数组求和 数组最大值 ✔ 进阶用法 数组对象中的用…

【Maven】007-Maven 工程的继承和聚合关系

【Maven】007-Maven 工程的继承和聚合关系 文章目录 【Maven】007-Maven 工程的继承和聚合关系一、Maven 工程的继承关系1、继承的概念2、继承的作用3、继承的语法4、父工程统一管理依赖版本父工程声明依赖版本子工程继承以来版本 二、Maven 工程的聚合关系1、聚合的概念2、聚合…

exec函数簇和守护进程

目录 一、exec函数族 二、守护进程 三、GDB调试多进程程序 一、exec函数族 exec函数使得进程当前内容被指定的程序替换。 示例&#xff1a; 运行结果&#xff1a; 代码就相当于执行命令&#xff1a;ls -a -l ./ 二、守护进程 举例&#xff1a; 运行结果&#xff1a; 举例…

计算机网络——第三层:网络层

1. IP数据报 1.1 IPV4数据报 1.1.1 IPv4数据报的结构 如图按照RFC 791规范显示了一个IPv4数据包头部的不同字段 IPv4头部通常包括以下部分&#xff1a; 1.1.1.1 版本&#xff08;Version&#xff09; 指明了IP协议的版本&#xff0c;IPv4表示为4。 1.1.1.2 头部长度&#x…

AR HUD全面「上新」

AR HUD赛道正在迎来新的时代。 上周&#xff0c;蔚来ET9正式发布亮相&#xff0c;新车定位为D级行政旗舰轿车&#xff0c;其中&#xff0c;在智能座舱交互层面&#xff0c;继理想L系列、长安深蓝S7之后&#xff0c;也首次取消仪表盘&#xff0c;取而代之的是业内首个全焦段AR H…

S1-07 事件组

事件组 在 FreeRTOS 中&#xff0c;事件组&#xff08;Event Group&#xff09;是一种用于任务间通信的机制&#xff0c;用于在多个任务之间同步和传递事件。 事件组主要包含一下两个概念&#xff1a; 事件标志位&#xff08;Event Flags&#xff09;&#xff1a;每个事件标志…

【CAN】Hardware Object的配置规则

文章目录 1. 前言2 发送缓存区的配置3 接收缓存区的配置4 Hardware Object的配置顺序 >>返回总目录<< 1. 前言 在英飞凌的芯片中&#xff0c;MCAN模块有一块Message RAM&#xff0c;这块空间主要用来划分过滤空间、接收数据空间以及发送数据空间&#xff0c;至于…