mysql事务及隔离机制

ops/2025/1/16 2:55:10/

mysql总结

mysql事务特性:

  1. 原子性(Atomicity)
  2. 一致性(Consistency)
  3. 隔离性(Isolation)
  4. 持久性(Durability)

并发访问数据库造成的问题:

  1. 脏读:读到了别的事务未提交的数据,当别的事务回滚后,那么读到的这个数据就是脏数据
  2. 不可重复读:在一个事务里,两次读取同一个数据集合,两次读到的数据不一致;主要发生在别的事务对读到的数据进行了更新操作,不可重复读重点在于数据的修改
  3. 幻读:幻读发生在范围读的时候,两次读的数据条数不一致;主要发生在别的事务对数据进行更新删除操作;简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行

Mysql的四大隔离级别:

在这里插入图片描述

可重复读(Repeatable Read):确保同一事务的多次读取结果一致,但可能发生幻读。

串行化是最严格的隔离级别,但是并发时每次读和写都需要加锁,会导致性能差。

Mysql默认的隔离级别是RR 可重复读级别。但是通过MVCC机制解决了读-写的并发问题。

在MySql中,我们也要处理三种类型的并发关系:

  • 读-读 并发; 这种情况下,不存在更新数据问题,只有读取数据,不存在并发问题
  • 读-写 并发: 有线程安全问题,可能导致脏读、不可重复读、幻读数据一致性读问题,必须由数据库提供的事务隔离机制来解决。
  • 写-写 并发: 有线程安全问题,可能存在更新丢失问题,比如第一类更新丢失问题(A事务撤销时,把已经提交的B事务的更新数据覆盖了)第二类更新丢失问题(A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失)。

数据库并发场景中,解决并发问题,就需要加锁。只有读-读之间的操作才可以并发执行,读-写写-读写-写操作都要阻塞,这样就会导致 MySQL 的并发性能极差。

MySql提供了一种乐观锁的实现:MVCC(多版本并发控制),来解决读-写并发不加锁

InnoDB引擎通过MVCC,解决了脏读、不可重复读,通过MVCC + Next-Key Lock(临键锁)来解决幻读,实现了事务的隔离级别Repeatable Read(可重复读)。

但是可重复读隔离级别下,写-写并发问题只能靠开发者显示或隐式使用锁来自行解决

MVCC是如何解决幻读的
https://blog.csdn.net/m0_73648729/article/details/144279025


http://www.ppmy.cn/ops/149000.html

相关文章

Qt官方下载地址

1. 最新版本 Qt官方最新版本下载地址:https://www.qt.io/download-qt-installer 当前最新版本Qt6.8.* 如下图: 2. 历史版本 如果你要下载历史版本安装工具或者源码编译方式安装,请转至此链接进行下载:https://download.qt.i…

NRF24L01模块STM32通信-通信初始化

目录 前言 一、IO口初始化 二、模拟SPI的基础代码 1.一些代码的宏定义 2.起始信号 3.CS,SCK,MOSI操作 4.MISO,IRQ操作 三.中间层代码 1.字节的输入和读取 2.写操作 3.读操作 四.应用层代码 1.24L01的检测 2.在main函数进行简单验证 3.24L01宏定义的代码 总结 前…

Nginx安全加固系列:防范XSS

XSS,就是跨站脚本攻击。就是浏览器渲染HTML的过程中,执行了不被预期的脚本指令,XSS就发生了。 所以,XSS就是一种HTML注入攻击,就是在我们的HTML页面上注入了恶意代码。最典型的就是在发表评论这些页面,在发…

C语言:单步调试与即时窗口的使用

1、单步调试 在实际开发中,常常会出现这样的情况,我们可以大致把出现问题的代码锁定在一定范围内,但无法确定到底是哪条语句出现了问题,该怎么办呢?按照前面的思路,必须要在所有代码行前面设置断点&#x…

负载均衡技术【内网去外网运营商出口负载均衡】

1 负载均衡概述 LB(Load Balance,负载均衡)是一种集群技术,它将特定的业务(网络服务、网络流量等)分担给多台网络设备(包括服务器、防火墙等)或多条链路,从而提高了业务…

大麦抢票科技狠活

仅供学习参考,切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉,于购票环节,大麦凭借恶意流量清洗技术,于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量,强化对刷票脚本、刷票软件以及…

Redis 安装与配置指南

Redis 安装与配置指南 目录 安装说明 Linux 安装 Redis 3.0 压缩包上传服务器编译和安装修改配置启动 Redis关闭 Redis 卸载 RedisRedis 集群配置 Master 主库配置启动 Master 节点的 Redis 和 Sentinel客户登录验证Slave 从库配置查看集群数据验证 安装说明 Linux 安装 R…

Java列表示例

示例1:使用ArrayList创建并操作列表 ArrayList是List接口最常用的实现之一,它内部使用数组来存储元素,因此对于随机访问具有很高的效率。但是,当涉及到频繁的插入或删除操作时,它的性能可能会受到影响,因为…