mysql事务详解

albert32 albert32     2022-12-09     237

关键词:

事务的特性
(Atomicity) 原子性 -- 回滚日志
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

C(Consistency) 一致性 --
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
I(Isolation) 隔离性 – 锁
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
D(Durability) 持久性 – 重做日志
一致性是事务追求的最终目标:前面提到的原子性、持久性和隔离性,都是为了保证数据库状态的一致性;事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。


D(Durability) 持久性– 重做日志
作用   
防止在发生故障的时间点,尚有脏页未写入磁盘(事务提交之后,数据写入磁盘之前宕机),在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

内容
物理格式的日志,记录的是物理数据页面的修改信息,其redo log是顺序写入redo log file的物理文件中去的。重做日志的恢复速度相比逻辑日志要快很多;

产生时间
事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

释放时间
当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

 

技术图片

 

 

 

 

更新一条数据的流程:

1、事务发起更新操作
2、从磁盘中读取数据到内存,并更新内存中的数据;
3、生成一条重做日志并写入重做日志缓存;
4、将重做日志缓存中的内容刷新到重做日志文件中
5、将内存中的数据更新到磁盘上

备注:

1、在每次将重做日志缓存写入重做日志文件后,InnoDb存储引擎都需要调用一次fsync操作;

2、数据库的性能->fsync的效率->磁盘的性能;

Innodb存储引擎为了提高数据库的性能,可以手动设置fsync的策略,允许非持久性的情况发生

参数:Innodb_flush_log_at_trx_commit

1:默认值,表示每一次事务提交都需要调用一次fsync操作;
0:事务提交时不进行写入重做日志的操作,仅在master thread中完成,即每1秒完成一次重做日志的文件的fsync操作;
2:表示事务提交时将重做日志缓存写入重做日志文件,单仅写入文件系统的缓存中,不进行fsync操作;数据库发生故障时,只要操作系统不宕机,并不会导致事务的丢失;

技术图片

 

 

A(Atomicity) 原子性 -- 回滚日志

作用   

保存了事务发生之前的数据的一个版本,可以用于回滚,可以提供多版本并发控制下的读(MVCC),也即非锁定读

内容   

逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

产生时间   

事务开始之前,生成当前的版本undo log,undo 也会产生 redo 来保证undo log的可靠性

释放时间   

当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

 备注:

逻辑日志举例说明:如插入10w条数据后,表空间增大,但是回滚后表空间不会收缩到原来的大小。

 举例说明:

技术图片

 

 

逻辑日志的另外一种理解,当回滚日志被使用时,它只会按照日志逻辑地将数据库中的修改撤销掉看,使用的每一条 INSERT 都对应了一条 DELETE,每一条 UPDATE 也都对应一条相反的 UPDATE 语句。

 

Purge   

事务提交后,undo log 不会立即删除,因为可能存在其他的事务需要通过undo log来获取当前版本之前的行记录;即实现MVCC(多版本并发控制)的一致性非锁定读;

一致性非锁定读
如果读取的行正在执行DELETE或UPDATE操作,不需要等待X锁的释放,InnoDB存储引擎会去读取一个快照数据,即该行之前版本的数据,这部分操作是通过undo log来实现的;

当改行记录已经不被任何其他的事务引用时,purge会最终完成undo记录的删除;

Purge根据history list进行undo log的清理,history list是按照事务提交的顺序对undo log进行链接,这样设计是为了避免线程进行大量的随机读取操作,提高purge的效率

 

I(Isolation) 隔离性 –事务的隔离级别

RAED UNCOMMITED
事务读取到其他事务未提交的数据,是级别最低的隔离机制;

READ COMMITED
事务读取到其他事务提交后的数据;

REPEATABLE READ
事务对同一份数据读取到的相同,不在乎其他事务对数据的修改;
InnoDB默认的隔离级别,通过Next-Key Lock避免幻读;

SERIALIZABLE
事务串行化执行,隔离级别最高,牺牲了系统的并发性;

技术图片

 

 

脏读:

事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据;
不可重复读:

事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致;
幻读:

同一事务中对同一范围的数据进行读取,结果却多出了数据或者少了数据,这就叫幻读。

不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

[mysql]事务acid详解(代码片段)

...历代表过去,能力代表现在,学习能力代表未来! 目录 1. 事务的概念2.事务的特性3.事务控制语法4.事务并发异常5.事务隔离级别1. 事务的概念事务指逻辑上的一组操作,组成这组操作的各个单元,除非全部正确执 查看详情

mysql事务详解

目录一、事务简介二、事务四大特性三、事务控制语句四、事务处理主要有两种方法一、事务简介事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这... 查看详情

mysql事务隔离级别锁相关的详解

MySQLInnoDB引擎中的事务详解!事务是什么?事务就是可以使一组操作要么全部成功要么全部失败,事务的目的是为了保证数据的最终一致性。举个例子:张三给李四的微信转了1000块红包。那自然李四的微信余额会扣减1000块,而... 查看详情

mysql5事务详解(代码片段)

一概念事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务,本文介绍基于MySQL5.6。 一个经典案例说明事务... 查看详情

mysql系列详解四:mysql事务-技术流ken(代码片段)

MySQL事务MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成... 查看详情

mysql进阶mysql事务详解(代码片段)

...详解8【MySQL基础】MySQL多表操作详解文章目录前言1,事务概念2,事务四大特性2.1,原子性2.2,一致性2.3,隔离性2.4,持久性3,事务基本操作3.1,开启事务3.2,回滚事务3.3,提交事务3.4,... 查看详情

mysql中事务以及事务隔离级别的详解(代码片段)

...分享一下给大家,👉点击跳转到网站一、MySQL中事务的理解二、演示事务的基本使用DROPTABLEt27;--1.创建一张测试表CREATETABLEt27(idINT,`name`VARCHAR(32));--2.开启事务STARTTRA 查看详情

mysql事务详解(代码片段)

🏆今日学习目标:🍀Spring事务和MySQL事务详解✅创作者:林在闪闪发光⏰预计时间:30分钟🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光... 查看详情

mysql知识点问题详解

...5.B+树和B树的区别6.使用B+树的好处三:数据库事务1.事务的四大特性2.事务中出现并发的问题3.事务的隔离级别4.事务更新一行数据的流程三:MVCC(多版本 查看详情

mysql事务详解

转至:https://www.cnblogs.com/personsiglewine/p/11507866.htmlmysql事务在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。一般来说,事务... 查看详情

netcore中数据库事务隔离详解——以dapper和mysql为例(代码片段)

原文:NetCore中数据库事务隔离详解——以Dapper和Mysql为例NetCore中数据库事务隔离详解——以Dapper和Mysql为例事务隔离级别准备工作Readuncommitted读未提交Readcommitted读取提交内容Repeatableread(可重读)Serializable序列化总结事务隔离级别.NE... 查看详情

mysql-innodb事务隔离级别-repeatableread详解

...第一个线程再读该表数据将仍然无法读出。和多数据库的事务级别应该有关系;还可以在第一个读之前先插 查看详情

一文详解mysql事务底层原理,全是干货,推荐收藏

...入正题。面试官:看你简历上面写着精通MySQL,我先问你事务的特性是什么?老生常谈,这个还有谁不会背的吗?我: 查看详情

mysql事务——万字详解(代码片段)

目录前言一.事务的概念    1.1什么是事务    1.2事务的属性    1.3事务的版本支持     1.4事务提交方式     1.5事务的常见操作    1.5.1准备阶段:     1.5.2手动演示回滚操作     1.5.3简单证明原子性     1.... 查看详情

mysql事务-rollback,commit用法详解(代码片段)

使用ROLLBACK既然我们已经知道了什么是事务处理,下面讨论事务处理的管理中所涉及的问题。管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。MySQL使用下面的语句来标识事务... 查看详情

mysql中事务四大特性的实现详解

MySQL事务的四大特性的实现基本概念原子性实现隔离性实现已提交读可重复读持久性实现日志文件刷新策略基本概念事务的四大特性ACID:原子性Atomic:事务的所有的SQL操作作为一个原子工作单元执行.要么全部执行,要么全部不执行... 查看详情

mysql中事务四大特性的实现详解

MySQL事务的四大特性的实现基本概念原子性实现隔离性实现已提交读可重复读持久性实现日志文件刷新策略基本概念事务的四大特性ACID:原子性Atomic:事务的所有的SQL操作作为一个原子工作单元执行.要么全部执行,要么全部不执行... 查看详情

一文详解-mysql事务和锁

...的更新从一个一致性状态变为另外一个一致性状态,使用事务处理是非常必要的,事务具有以下四个特性:MySQL提供了多种事务型存储引擎,如InnoDB和BDB等,而MyISAM不支持事务。为了支持事务,InnoDB存储引擎引入了与事务处理相... 查看详情