MYSQL之事务

server/2024/10/21 2:41:28/

事务有哪些特性?

四大特性:ACID

  • 原子性:一个事务的操作要么全部成功,要么全部失败。

  • 一致性:是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。

  • 隔离性:事务和事务之间是互不干扰的,MYSQL使用了MVCC机制和next-key lock机制来实现隔离性。

  • 持久性:事务执行完后,数据是持久化到磁盘的,属于永久操作。

  • MYSQL是怎么保证事务的这些特性的?

    • 原子性:是由 undo log(回滚日志)保证

    • 一致性:是由 redo log(重做日志)保证

    • 隔离性:是由 MVCC机制 和 next-key lock机制 保证

    • 持久性:是由 原子性+一致性+隔离性+持久性 保证

 

并行事务会引发什么问题?

同时处理多个事务时,可能出现:脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)

  • 脏读(dirty read)一个事务「读到」了另一个「未提交事务修改过的数据」

  • 不可重复读(non-repeatable read)在一个事务内多次读取同一个数据,出现前后两次读到的数据不一样的情况

  • 幻读(phantom read)在一个事务内多次查询某个符合查询条件的「记录数量」,出现前后两次查询到的记录数量不一样的情况

 

事务的隔离级别有哪些?

同时处理多个事务时,就可能出现:脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)

  • 读未提交:

    • 一个事务未提交时,可以被其他事务看到

    • 可能发生脏读、不可重复读和幻读现象

  • 读已提交:

    • 一个事务提交之后,才能被其他事务看到

    • 可能发生不可重复读和幻读现象

  • 可重复读:

    • 一个事务执行过程中看到的数据,和开始事务时看到的数据是一致的。

    • MySQL InnoDB 引擎的默认隔离级别

    • 可能发生幻读现象

  • 可串化:

    • 对记录加上 读写锁,在多个事务对这条记进行读写操作时,如果发生读写冲突,后访问的事务需等待前一个事务执行完成,才能继续执行。

    • 脏读、不可重复读和幻读现象都不可能会发生。

 

MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了)

  • 针对 快照读(select...),数据库采用的是 MVCC机制 来解决幻读,只有某些特殊情况还是会产生幻读。

    • 因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。

  • 针对 当前读(select ... for update),数据库采用的是 next-key lock(记录锁+间隙锁)

    • 因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

 

 特殊情况:
  • 事务A开始

  • 事务A执行查询id=5,但id=5这个记录在行中是不存在的,所以查出为null

  • 事务B开始

  • 事务B执行增加id=5的数据

  • 事务B提交

  • 事务A对id=5的数据进行更新操作

  • 事务A执行查询id=5,搜索到了事务B提交的数据

  • 事务A提交

在可重复读隔离级别下,事务 A 第一次执行普通的 select 语句时生成了一个 ReadView,之后事务 B 向表中新插入了一条 id = 5 的记录并提交。接着,事务 A 对 id = 5 这条记录进行了更新操作,在这个时刻,这条新记录的 trx_id 隐藏列的值就变成了事务 A 的事务 id,之后事务 A 再使用普通 select 语句去查询这条记录时就可以看到这条记录了,于是就发生了幻读。

所以MVCC机制并不能完全解决幻读


http://www.ppmy.cn/server/4894.html

相关文章

Win11启用HyperV

Win11启用HyperV 编辑一个txt,输入下面的指令 pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%SystemRoot%…

mac dex2jar安装

如果你在终端中收到 “zsh: command not found: dex2jar” 的消息,这意味着 dex2jar 工具没有安装在你的系统中,或者没有被添加到系统的 PATH 环境变量中。为了解决这个问题,你需要按照以下步骤操作: 下载 dex2jar: 前…

The O-one:开源语言模型计算机的革命

在人工智能的浪潮中,The O-one作为一个创新的开源项目,正以其独特的功能和开放性吸引着全球开发者和科技爱好者的目光。这个项目不仅仅是一个简单的语言模型,它是一个能够通过语音交互与计算机进行对话的智能系统,极大地提升了人机…

jupyter notebook的使用

jupyter notebook的使用 1.对单元格操作 1.1新增单元格: 使用a在选中单元格的上方创建新的单元格 使用b>在选中单元个的下方创建新的单元格删除cell 删除单元格 dd删除选用的单元格 X剪切(有时候剪切也可以代替删除) 复制cell c 复制选…

【心路历程】初次参加蓝桥杯实况

送给大家一句话: 寂静的光辉平铺的一刻,地上的每一个坎坷都被映照得灿烂。 – 史铁生 《我与地坛》 初次参加蓝桥杯有感 一点小小的震撼难评的做题过程A题 艺术与篮球问题描述解题 B 题 五子棋问题描述解题 C题 训练士兵问题描述解题 D题 团建解题 E题 …

国密SM2+RSA+AES+MD5加解密,验签流程,工具示例,增强版完善版(包含前后端加解密验签流程)

详见资源包 https://download.csdn.net/download/x948130516/89119461?spm1001.2014.3001.5503 前端引入依赖 使用hutool工具进行签名和验签时,前端需要传入第三个json对象参数,否则会验签失败 前端使用npm install --save sm-crypto引入依赖库 前…

大模型实战案例:8卡环境微调马斯克开源大模型 Grok-1

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

rust 写命令行程序,如何控制字符显示的水平位置?

在Rust中,要控制字符在CMD终端上显示的水平位置,你通常需要使用终端控制序列。这些控制序列允许你移动光标、更改文本颜色、清除屏幕等。 对于Windows CMD终端,其支持的控制序列相对有限,但你可以使用基本的控制序列来移动光标。…