MySQL 事务篇

news/2024/11/29 10:45:37/

事务有哪些特性?

原子性:

一个事务中的所有操作,必须全部执行。要么全部完成要么就不完成。中间如果出现错误,就要回滚到初始状态。

持久性:

事务处理结束后,对数据的修改就是永久的,就是系统故障也不会改变

一致性:

指事务操作前后,数据保持完整约束性。

隔离性:

数据库具有多个并发事务同时对数据进行读写和修改的能力。隔离性可以防止多个并发事务在执行时由于交叉执行而导致的数据不一致。

为了实现以上四个特性。数据库实现了一下机制:

持久性通过redo log  (重做日志)来实现

原子性通过undo log (回滚日志)实现

隔离性通过MVCC多并发控制或者锁来实现

一致性通过 持久性+原子性+隔离性 实现

 首先讲隔离性:

并发事务会引发的问题:

脏读:一个事务读到了另个事务未提交的数据

不可重复度:在一个事务内多次读取同一个数据,发现两次读取的数据不一致

幻读:在一个事务中多次查询某个符合查询条件的记录数量,发现两次查询的记录数量不一致。

SQL提供四种隔离级别来规避以上四种现象,隔离级别越高,性能效率越低

读未提交:可以读取到另一个事务未提交的数据 (可能会发生脏读,不可重复读,幻读)

读提交:可以读取到另一个事务已提交的数据(可能会发生不可重复读,幻读)

可重复读:从一个事务开启,他读取到的数据从始至终就是一致的 (可能会发生幻读)

Innodb 引擎的默认隔离级别是可重复读。但是他很大程度上避免了幻读。采用了以下两种方式

1. 针对快照读(普通select语句)

它采用了MVCC多并发控制,因为事务在执行过程中看到的数据,一直和事务启动时看到的数据是一致的。所以即使其他事务中途插入一条数据,也不会被该事务看到。

2. 针对当前读(select ...for update)

间隙锁+记录锁来实现。当执行语句时,会加上记录锁和间隙锁。如果有其他事务在在间隙锁和记录锁内插入一条数据,就会被阻塞。无法插入数据,就很好的避免了幻读现象。

 下面讲讲ReadView在MVCC里如何工作的

先了解ReadView的两个重要知识

1. ReadView 的四个字段

2. 聚簇索引记录中两个跟事务有关的两个隐藏列

 1. m_ids 当前数据库中活跃事务id列表,活跃事务指的是启动了但是还未提交的数据

 2. min_trx_id 创建ReadView时,当前数据库活跃且未提交的事务中最小事务的事务id

 3. max_trx_id 创建ReadView当前数据库中应该给下一个事务的id值,当前数据库最大id值+1

  4. creator_trx_id 指创建该事务时的id值

聚簇索引记录中的两个隐藏列

 trx_id 

当一个事务对某条聚簇索引记录进行改动时,就会把该事物的 id 隐藏在trx_id 中

 roll_pointer

每次对聚簇索引记录进行改动时,就会把旧版本的记录写入到 undo 日志中,然后roll_pointer 是一个指针,指向每一个旧版本记录,可以通过它找到修改前的记录。

创建ReadView之后,可以将记录中的trx_id 分为三种情况:

 一个事务访问记录时,除了自己更新的记录总是可见之外,还有以下几种情况:

1. 如果记录的 trx_id 值小于min_trx_id ,说明这个版本的记录是在创建ReadView前已经提交的十五生成的。所以该版本记录对该事务可见。

 2. 如果记录的trx_id 值大于max_trx_id ,说明这个版本的记录是在创建ReadView后的事务提交生成的,所以该版本记录对该事务不可见。

 3. 如果该记录的trx_id在min_trx_id和max_trx_id之间,需要判断trx_id是否在m_ids 列表中

         1)在m_ids 列表中,表示生成该记录的事务仍然活跃着,所以该记录不可见

         2)不在m_ids 列表中,表示该事务已经提交,该记录可见。

这种通过版本链(通过undo日志来实现,使用roll_pointer 来实现指向旧版本的记录)的形式来控制多并发事务访问同一个记录的行为叫做MVCC(多版本并发控制)

可重复读和读提交都是通过ReadView来实现,可重复读是从始至终每个事务就有一个ReadView

而读提交在每次读取数据时都会创建一个新的ReadView。


http://www.ppmy.cn/news/104919.html

相关文章

【浅学 JDBC】

浅学JDBC 笔记记录 一、1. JDBC的概念2. JDBC快速入门2.1 DriverManager2.2 Connection2.3 Statement2.4 ResultSet 3. JDBC入门案例使用3.1 查询所有学生信息3.2 根据id查询学生信息&&新增学生信息&&修改学生信息&&删除学生信息 一、 1. JDBC的概念 …

中国生物科技公司【Advanced Biomed】申请纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于台湾台南的生物科技公司【Advanced Biomed】近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为(AD…

基于SSM的服装设计供需系统设计与实现

摘 要:作为服装设计的重要形式之一,服装具有显著的审美性,是人类情感表达不可忽视的代表形态。但在新时期背景下,随着服装设计的进一步优化,服装设计创新融合强度也随之增强。本文就服装设计供需系统进行深入探究。 服…

从入门到精通38万字超详细的Java面试题八股文知识点全面汇总

从入门到精通38万字超详细的Java面试题&八股文&知识点全面汇总 点击下方链接获取文档: 从入门到精通38万字超详细的Java面试题&八股文&知识点全面汇总 目录: 1、Java基础&框架&容器面试题 ​ 1.1 Java基础面试题 ​ 1.2 java容器面试题…

八、(重点)视图集ModelViewSet自定义action路由routers

上一章: 七、Django DRF框架GenericAPIView--搜索&排序&分页&返回值_做测试的喵酱的博客-CSDN博客 下一章: 九、DRF生成API文档_做测试的喵酱的博客-CSDN博客 一、视图集ModelViewSet与ReadOnlyViesSet ModelViewSet视图集 与 ReadOnly…

Emacs之git操作(一百零五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

REST风格 -- SpringMVC入门保姆级教程(四)

文章目录 前言四、REST风格1.了解REST风格2.REST风格写法一般步骤3.REST风格快速开发4.REST风格中的注解5. 案例:基于REST风格页面数据交互 总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然&#…

Linux更改SSH端口,并解决SSHD服务重启失败的问题

环境:Linux Centos 7 1.进入sshd配置文件:vi /etc/ssh/sshd_config 2、找到“#Port 22”这行,删掉注释符#,将端口改为(想要变成的端口号 如:2022): 3.重启sshd服务: sy…