深入理解MySQL中的事务【超详细配图版】

MySQL存储过程的实现及其高级特性的应用 内容概要:本文详细介绍了MySQL存储过程的各种功能和技术细节,包括变量的定义与赋值、传入与传出参数、条件语句(如if-then-else)、循环语句(如while和repeat)、游标的使用方法、函数的定义与使用以及事件调度器(Event)。同时,还包括了一些高阶特性和综合案例,如使用Python脚本与MySQL存储过程结合进行数据归档和清理。 适合人群:具有一定的数据库管理和维护经验的技术人员,特别是MySQL数据库开发者和管理员。 阅读详情

文章目录

1 引言

想必参加过后台开发面试的伙伴们都知道,MySQL事务这玩意是各大面试官百问不厌的知识点,但是大家对于事务的了解到什么层面呢,仅仅停留在ACID上么,这篇文章将陪着大家一起深入MySQL中的事务。

2 事务的特性

引言中所提到的ACID正是事务的四个特性:分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • 原子性(Atomicity) :事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency) :事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  • 隔离性(Isolation) :多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability) :已被提交的事务对数据库的修改应该永久保存在数据库中。

其中一致性不太好理解,一致性是说无论事务提交还是回滚,不会破坏数据的完整性。比如A给B转100元,如果成功了,A的账户必定会扣100元,而B的账户必定会增加100元;如果失败了,A和B的账户余额不会改变。A和B中的账户金额变动必然是一个完整的过程(不可能是A扣除了50,B增加了50这种情况),整个过程必须是一致的。

2.1 原子性

事务的原子性是指:一个事务中的多个操作都是不可分割的,只能是全部执行成功、或者全部执行失败。
MySQL事务的原子性是通过undo log来实现的。undo log是InnoDB存储引擎特有的。具体的实现机制是:将所有对数据的修改(增、删、改)都写入日志(undo log)。

undo log是逻辑日志,可以理解为:记录和事务操作相反的SQL语句,事务执行insert语句,undo log就记录delete语句。它以追加写的方式记录日志,不会覆盖之前的日志。除此之外undo log还用来实现数据库多版本并发控制(Multiversion Concurrency Control,简称MVCC)。
如果一个事务中的一部分操作已经成功,但另一部分操作,由于断电/系统崩溃/其它的软硬件错误而无法成功执行,则通过回溯日志,将已经执行成功的操作撤销,从而达到全部操作失败的目的。

2.2 持久性

事务的持久性是指:一个事务对数据的所有修改,都会永久的保存在数据库中。
MySQL事务的持久性是通过redo log来实现的。redo log也是InnoDB存储引擎特有的。具体实现机制是:当发生数据修改(增、删、改)的时候,InnoDB引擎会先将记录写到redo log中,并更新内存,此时更新就算完成了。同时InnoDB引擎会在合适的时机将记录刷到磁盘中。
redo log是物理日志,记录的是在某个数据页做了什么修改,而不是SQL语句的形式。它有固定大小,是循环写的方式记录日志,空间用完后会覆盖之前的日志。

undo log和redo log并不是直接写到磁盘上的,而是先写入log buffer。再等待合适的时机同步到OS buffer,再由操作系统决定何时刷到磁盘,具体过程如下:
在这里插入图片描述既然undo log和redo log都是从log buffer 到 OS buffer,再到磁盘。所以中途还是有可能因为断电/硬件故障等原因导致日志丢失。为此MySQL提供了三种持久化方式:这里有一个参数innodb_flush_log_at_trx_commit,这个参数主要控制InnoDB将log buffer中的数据写入OS buffer,并刷到磁盘的时间点,取值分别为0,1,2,默认是1。这三个值的意思如下图所示:
在这里插入图片描述
首先查看MySQL默认设置的方式1,也就是每次提交后直接写入OS buffer,并且调用系统函数fsync()把日志写到磁盘上。就保证数据一致性的角度来说,这种方式无疑是最安全的。但是我们都知道,安全大多数时候意味着效率偏低。每次提交都直接写入OS buffer并且写到磁盘,无疑会导致单位时间内IO的次数过多而效率低下。除此之外,还有方式0和方式2。基本上都是每秒写入磁盘一次,所以效率都比方式1更高。但是方式0是把数据先写入log buffer再写入OS buffer再写入磁盘,而方式2是直接写入OS buffer,再写入磁盘,少了一次数据拷贝的过程(从log buffer到OS buffer),所以方式2比方式0更加高效。

了解了undo log和redo log的作用和实现机制之后,那么这两个日志具体是怎么让数据库从异常的状态恢复到正常状态的呢?

数据库系统崩溃后重启,此时数据库处于不一致的状态,必须先执行一个crash recovery的过程:首先读取redo log,把成功提交但是还没来得及写入磁盘的数据重新写入磁盘,保证了持久性。再读取undo log将还没有成功提交的事务进行回滚,保证了原子性。crash recovery结束后,数据库恢复到一致性状态,可以继续被使用。

2.3 隔离性

数据库事务的隔离性是指:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。正常情况下,肯定是多个事务同时操作同一个数据库,所以事务之间的隔离就显得必不可少。
如果没有隔离性,将会发生以下问题:

2.3.1 第一类丢失更新

一个事务在撤销的时候,覆盖了另一个事务已提交的更新数据。
假设现在有两个事务A、B同时操作同一账户的金额,如下图所示:
在这里插入图片描述
显然,事务B在撤销事务的时候,覆盖了事务A在T4阶段已经提交的更新数据。A在T3的时候已经取走了200元,此时的余额应该是800元,但是由于事务B开始的时候,余额是1000元,所以回滚后,余额也会变成1000元。这样一来,用户明明取了钱,但是余额不变,银行亏到姥姥家了。

2.3.2 脏读

一个事务读到了另一个事务未提交的更新数据。
用下图说明:
在这里插入图片描述
事务A在T3的时候取走了200元,但是未提交。事务B在T4时查询余额就能看到事务A未提交的更新。

2.3.3 幻读

幻读(虚读)是指:一个事务读到了另一个事务已提交的新增数据。
依然是配图说明:
在这里插入图片描述
事务B在同一个事务中执行两次统计操作之间,另一事务insert了一条记录,导致得到的结果不一样,好像发生了幻觉。还有一种情况是事务B更新了表中所有记录的某一字段,之后事务A又插入了一条记录,事务B再去查询发现有一条记录没有被更新,这也是幻读。

2.3.4 不可重复读

不可重复读:一个事务读到了另一个事务已提交的更新数据。
不可重复读,顾名思义,就是在同一个事务中重复读取数据会发生不一致的情况,如下图:
在这里插入图片描述
事务B在T2和T5阶段都执行了查询余额的操作,但是每次得到的结果都不一样,这在开发中是不允许的,同一个事务中同样的多次查询,每次返回不一样的结果,让人不免会对数据库的可靠性产生怀疑。

2.3.5 第二类丢失更新

一个事务在提交的时候,覆盖了另一个事务已提交的更新数据。在这里插入图片描述
由上图可以看出,当事务A提交之后,账户余额已经发生了变动,然后事务B还是基于原始金额(即1000)的基础上扣除取款金额的,事务B以提交,就是把事务A的提交给完全覆盖了。此为第二类丢失更新。

注意和第一类丢失更新区分,第一类丢失更新重点在事务B最终撤销了事务,第二类是最终提交了事务。

为了解决这五类问题,MySQL提供了四种隔离级别:

  • Serializable(串行化) :事务之间以一种串行的方式执行,安全性非常高,效率低
  • Repeatable Read(可重复读) :是MySQL默认的隔离级别,同一个事务中相同的查询会看到同样的数据行,安全性较高,效率较好
  • Read Commited(读已提交) :一个事务可以读到另一个事务已经提交的数据,安全性较低,效率较高
  • Read Uncommited(读未提交) :一个事务可以读到另一个事务未提交的数据,安全性低,效率高
隔离级别是否出现第一类丢失更新是否出现脏读是否出现虚读是否出现不可重复读是否出现第二类丢失更新
Serializable否否否否否
Repeatable Read否否是否否
Read Commited否否是是是
Read Uncommited否是是是是

3 Repeatable Read

Repeatable Read(可重复读)是MySQL默认的隔离级别,也是使用最多的隔离级别,所以单独拿出来深入理解很有必要。Repeatable Read无法解决幻读(虚读)问题。下面来看一个实例。
首先创建一个表并插入一条记录:

CREATE TABLE `student` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `stu_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '学生学号',
  `stu_name` varchar(100) DEFAULT NULL COMMENT '学生姓名',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标志,0:未删除,2:已删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='学生信息表';


INSERT INTO `student` VALUES (1, 230160340, 'Carson', '2016-08-20 16:37:00', '2016-08-31 16:37:05', 0);
复制代码

同样的开启两个事务,如下表所示:

时间事务A事务B
T1SELECT * FROM student-
T2-INSERT INTO student VALUES (2, 230160310, ‘Kata’, ‘2016-08-20 16:37:00’, ‘2016-08-31 16:37:05’, 0)
T3-commit
T4SELECT * FROM student-

按照上述理论,会出现幻读现象。也就是事务A在T4时间段的查询select会看到事务B提交的新增数据。
但要让你失望了。

执行结果如下
在这里插入图片描述
和预期的结果并不一致,没有出现幻读现象。
实际上MySQL在Repeatable Read隔离级别下,用MVCC(Multiversion Concurrency Control,多版本并发控制)解决了select普通查询的幻读现象。
具体的实现方式就是事务开始时,第一条select语句查询结果集会生成一个快照(snapshot),并且这个事务结束前,同样的select语句返回的都是这个快照的结果,而不是最新的查询结果,这就是MySQL在Repeatable Read隔离级别对普通select语句使用的快照读(snapshot read)。

快照读和MVCC是什么关系?

MVCC是多版本并发控制,快照就是其中的一个版本。所以可以说MVCC实现了快照读,具体的实现方式涉及到MySQL的隐藏列。MySQL会给每个表自动创建三个隐藏列:

  • DB_TRX_ID:事务ID,记录操作(增、删、改)该数据事务的事务ID
  • DB_ROLL_PTR:回滚指针,记录上一个版本的数据在undo log中的位置
  • DB_ROW_ID:隐藏ID ,创建表没有合适的索引作为聚簇索引时,会用该隐藏ID创建聚簇索引

由于undo log中记录了各个版本的数据,并且通过DB_ROLL_PTR可以找到各个历史版本,并且由DB_TRX_ID决定使用哪个版本(快照)。所以相当于undo log实现了MVCC,MVCC实现了快照读。

如此看来,MySQL的Repeatable Read隔离级别利用快照读,已经解决了幻读的问题。
但是事实并非如此,接下来再看一个例子

时间事务A事务B
T1SELECT * FROM student-
T2-INSERT INTO student VALUES (3, 230160312, ‘Luffy’, ‘2016-08-20 16:37:00’, ‘2016-08-31 16:37:05’, 0)
T3-commit
T4UPDATE student SET stu_name = ‘Katakuri’ WHERE stu_name = ‘Luffy’;-
T5SELECT * FROM student-

事务A在T1的时候生成快照,事务B在T2的时候插入一条数据Luffy,然后提交。在T4的时候把Luffy更新成Katakuri,根据上一个例子的经验,此时事务A是看不到Luffy这条数据的,所以更新也不会成功,并且在T5的时候查询,和T1时候一样,只有Carson和Kata两条数据。

但是,又要让你失望了

执行结果如下
在这里插入图片描述

但是执行结果却不是预期的那样,事务A不仅看到了Luffy,还把它成功的改成了Katakuri。即使事务A成功commit之后,再次查询还是这样。

这其实是MySQL对insert、update和delete语句所使用的当前读(current read)。因为涉及到数据的修改,所以MySQL必须拿到最新的数据才能修改,所以涉及到数据的修改肯定不能使用快照读(snapshot read)。由于事务A读到了事务B已提交的新增数据,所以就产生了前文所说的幻读。

那么在Repeatable Read隔离级别是怎么解决幻读的呢?

是通过间隙锁(Gap Lock)来解决的。我们都知道InnoDB支持行锁,并且行锁是锁住索引。而间隙锁用来锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为Repeatable Read或以上级别而设的,间隙锁和行锁一起组成了Next-Key Lock。当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁,再对索引记录两边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙插入记录。这样就有效的防止了幻读的发生。

默认情况下,InnoDB工作在Repeatable Read的隔离级别下,并且以Next-Key Lock的方式对索引行进行加锁。当查询的索引具有唯一性(主键、唯一索引)时,Innodb存储引擎会对Next-Key Lock进行优化,将其降为行锁,仅仅锁住索引本身,而不是范围(除非锁定不存在的值)。若是普通索引,则会使用Next-Key Lock将记录和间隙一起锁定。

使用快照读的查询语句

SELECT * FROM ...
复制代码

使用当前读的语句

SELECT * FROM ... lock in share mode
SELECT * FROM ... for update
INSERT INTO table ...
UPDATE table SET ...
DELETE table WHERE ...
复制代码

4 小结

本文主要讲解了MySQL事务的ACID四大特性,undo log和redo log分别实现了原子性和持久性,log持久化的三种方式,数据库并发下的五类问题、四种隔离级别、RR隔离级别下select幻读通过MVCC机制解决、select ... lock in share mode/select ... for update/insert/update/delete的幻读通过间隙锁来解决。
本文涉及的比较深入,掌握好本文的知识点,让你不仅仅是停留在ACID、隔离级别的层面,在面试中能够化被动为主动,收割大厂offer。

点点关注,不会迷路


 

《JavaSE系列教程》 本专栏内容是为零基础正在学习Java的学习者量身定制的学习路线及方案,本教程字数超20w+,插图超过400+,知识体系极其全面,案例极其丰富。本配备有专门的学习群及学习视频,读者可加学习群与正在学习该阶段的人一同学习,有任何不懂的也可以观看于此教程配套的学习视频。 阅读详情

相关推荐

MySQL 5.7 中文文档实战:本地知识库搭建与避坑指南

MySQL 5.7 虽已停止主流支持,但仍在大量生产环境中服役。面对官方英文文档的阅读门槛,中文文档成为 DBA 和开发者的刚需。其核心原理在于将版本特性、参数行为与中文语境对齐,降低误用风险。技术价值体现在提升排查效率、减少版本混淆导致的故障。典型应用场景包括 CentOS/Windows 安装初始化、事务与锁的观测、排序分页优化及存储过程调试。通过构建带版本锚点的本地可检索知识库,并挂载团队批注,可将静态文档转化为动态资产。本文围绕 MySQL 5.7 中文文档的深度使用,提供从索引构建到常见翻车场景的

weixin_33883104的博客 182

MySQL--事务持久化原理探究

InnoDB 引擎独有的日志模块,redo log 通常是物理日志,记录的是数据页的物理修改。

Paranoid 1824

协同过滤推荐系统实战:Spring Boot+Vue+MySQL从算法到落地

推荐系统是互联网产品连接用户与内容的核心技术,协同过滤则是其中应用最广的算法范式。它通过分析用户与物品的历史交互行为,计算相似度矩阵,从而预测用户可能感兴趣的物品,实现个性化推荐。在实际工程中,算法需要与后端服务、数据存储和前端展示深度整合,才能真正发挥价值。Spring Boot作为成熟的Java后端框架,负责接口编排与业务逻辑;MySQL承载用户、物品及行为数据;Vue提供动态交互界面。通过将协同过滤计算放在Python离线脚本中完成,在线接口仅查询预计算结果,可以在保证推荐质量的同时实现毫秒级响应。这

weixin_42525005的博客 333

MySQL 数据的持久化

Redo Log 和 Bin Log 各自承担不同的职责:Redo Log 保证数据的持久性和崩溃恢复,而 Bin Log 则主要用于数据备份和复制。: Redo Log 记录的是数据库在内存中的数据变更,所有的变更先写入 Redo Log,确保即便数据库崩溃,系统可以通过 Redo Log 重新执行这些变更,恢复数据库。MySQL 数据的持久化主要依赖于其事务日志( Redo Log 和 Bin Log)来保证,即使在系统崩溃或宕机的情况下也能恢复数据。当写满时,系统会从头开始覆写日志内容。

m0_74064008的博客 1028

ubuntu18.04安装R——无法连接上 dl.google.com:80 (6.6.6.6),连接超时&&E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

安装R的时候,sudo apt update 的时候出现错误: 查资料要修改/etc/apt/sources.list.d/google-chrome.list 文件 原来是: deb http://dl.google.com/linux/chrome/deb/ stable main 改为: deb [arch=amd64] http://dl.google.com/linux/chrom...

许希律的博客 4350

Minio HTTPS证书配置实战:从申请到部署全流程

本文详细介绍了Minio HTTPS证书配置的全流程,从申请到部署,确保对象存储服务的安全性。内容包括证书类型选择、文件处理、服务配置调整及常见问题解决,帮助用户在生产环境中快速实现HTTPS加密传输,提升数据安全。

weixin_42638178的博客 431

mysql是如何保证持久性的

redo log, binlog,重做日志

majinan3456的博客 2153

算法 A 求稳健平均值和稳健标准差

文章目录算法原理代码 算法原理 算法 A 来自 GB/T 6379.5。应用此算法计算得到数据平均值和标准差的稳健值。稳健性是估计算法的特点,而不是其产生的估计值的特点,因此严格来说,称由此算法计算的平均值和标准差是稳健的是不确切的。然而,为避免使用繁琐的术语,“稳健均值”和“稳健标准差”应理解为利用稳健算法计算的总体均值和总体标准差的均值估计。 设数据为 xi,i∈(1,2,⋯ ,n)x_i, i\in(1,2,\cdots,n)xi​,i∈(1,2,⋯,n),记稳健平均值为 x∗,s∗x^*, s^*x

zhuo木鸟的博客 9254

mysql日志持久化机制

mysql日志持久化机制

qq_41820066的博客 916

java技术专家 【DDD(领域驱动设计)思想解读及优秀实践 22】|泛化建模(上):领域知识更抽象怎么办?

java技术专家 【DDD(领域驱动设计)思想解读及优秀实践 22】|泛化建模(上):领域知识更抽象怎么办?

大壮 1166

使用LabVIEW创建和分析柱状图:从基础绘制到高级数据分析的完整指南

LabVIEW,全称为Laboratory Virtual Instrument Engineering Workbench,是由美国国家仪器公司(National Instruments, NI)开发的一款图形化编程语言。自1986年首次推出以来,LabVIEW凭借其强大的数据采集、分析和控制能力,在工程、科研、教育等领域得到了广泛应用。与传统的文本编程语言不同,LabVIEW采用了图形化编程方式,用户通过连接不同的函数节点来实现复杂的逻辑和算法。

qq_38334677的博客 775

MySQL如何保证持久性

事务的每个操作都会先写入日志,确保即使系统崩溃,数据也能恢复。

weixin_46072507的博客 1160

手把手完整实现STM32+LORA组网网关+机智云平台+手机APP应用———第一节- 一主多从的LORA本地组网通信-实现从机采集温湿度与主机显示数据

本教程为《手把手实现STM32+LORA组网网关+机智云平台+手机APP应用》第一节。实现一个主机,两个从机的LORA组网通信。两个从机采集温湿度数据并通过LORA传输数据到主机,然后主机接收到两个从机数据后进行数据显示,本节通过PC串口助手显示两个从机的数据。 下一节将其主机接收的数据通过WIFI网关(ESP8266)传到机智云平台与手机APP。 本文讲解一主多从的LORA本地组网通信,串口助手进行数据展示。使用硬件主要包括:STM32F103C8T6最小系统板(3个)、正点原子LORA模块ATK-L

嵌入式阿齐Archie 1万+

mysql current read_【享学MySQL】系列:深入理解MySQL中的事务【超详细配图版】

1 引言想必参加过后台开发面试的伙伴们都知道,MySQL事务这玩意是各大面试官百问不厌的知识点,但是大家对于事务的了解到什么层面呢,仅仅停留在ACID上么,这篇文章将陪着大家一起深入MySQL中的事务。2 事务的特性引言中所提到的ACID正是事务的四个特性:分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)原子性(At...

weixin_39827625的博客 124

5 分钟上手 Kimi Work:安装、配置、跑通第一个任务

这篇文章提供了Kimi Work的快速入门指南,帮助用户在5分钟内完成从安装到运行第一个任务的全过程。主要内容包括: 安装步骤: macOS用户下载.dmg文件并拖入Applications Windows用户下载.exe安装包,需注意中文路径问题 初始设置: 使用现有Kimi账号登录 检查任务配额和文件访问权限 首个任务推荐: 建议从简单的本地文件整理开始(如按类型分类桌面文件) 详细说明了任务执行流程和审批机制 常见问题: 计划生成卡顿的解决方法 文件无变化的排查步骤 进阶建议: 提供难度递增的后续任务

sg_knight的专栏 2785

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2204

MySQL事务还能这么理解?这回我知道怎么应付面试官了

显然,事务B在撤销事务的时候,覆盖了事务A在T4阶段已经提交的更新数据。A在T3的时候已经取走了200元,此时的余额应该是800元,但是由于事务B开始的时候,余额是1000元,所以回滚后,余额也会变成1000元。这样一来,用户明明取了钱,但是余额不变,银行亏到姥姥家了。 2.3.2 脏读 一个事务读到了另一个事务未提交的更新数据。 用下图说明: 事务A在T3的时候取走了200元,但是未提交。事务B在T4时查询余额就能看到事务A未提交的更新。 2.3.3 幻读 幻读(虚读)是指:一个事务读到了另一个事务已提

m0_63174475的博客 283

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

深入理解MySQL:体系结构与SQL语句执行流程

在数据库领域,MySQL作为开源关系型数据库的佼佼者,被广泛应用于各类系统中。无论是日常业务查询还是高频数据更新,了解MySQL的内部体系结构与SQL语句执行流程,都是开发者优化性能、排查问题的核心基础。本文将从MySQL的分层结构入手,详细拆解查询语句与更新语句的完整生命周期,帮助大家建立对MySQL运行机制的系统性认知。

专注Java和MySQL领域知识分享 1002

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL事务还能这么理解?这回我知道怎么应付面试官了,熬夜整理最新大厂Java高频面试题

了解了undo log和redo log的作用和实现机制之后,那么这两个日志具体是怎么让数据库从异常的状态恢复到正常状态的呢? 数据库系统崩溃后重启,此时数据库处于不一致的状态,必须先执行一个crash recovery的过程:首先读取redo log,把成功提交但是还没来得及写入磁盘的数据重新写入磁盘,保证了持久性。再读取undo log将还没有成功提交的事务进行回滚,保证了原子性。crash recovery结束后,数据库恢复到一致性状态,可以继续被使用。 2.3 隔离性 数据库事务的隔离性是指:多.

m0_64384202的博客 299

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

MySQL事务还能这么理解?这回我知道怎么应付面试官了,目前最全的《Java面试题及解析》

首先查看MySQL默认设置的方式1,也就是每次提交后直接写入OS buffer,并且调用系统函数fsync()把日志写到磁盘上。就保证数据一致性的角度来说,这种方式无疑是最安全的。但是我们都知道,安全大多数时候意味着效率偏低。每次提交都直接写入OS buffer并且写到磁盘,无疑会导致单位时间内IO的次数过多而效率低下。除此之外,还有方式0和方式2。基本上都是每秒写入磁盘一次,所以效率都比方式1更高。但是方式0是把数据先写入log buffer再写入OS buffer再写入磁盘,而方式2是直接写入OS b.

m0_64867896的博客 113

【第2章】Seata1.3.0源码编译+参数配置+启动运行(超详细)

一、什么是Seata? 官网地址:https://seata.io 提炼关键词: 特性: 1、一致性(这个是痛点,解决的就是微服务分布式事务一致性的问题) 2、高性能(这个是卖点,如果用了反而拖累整个微服务架构的性能,试问谁还会用呢?) 3、易用性(这个是亮点,大家开发时引入新技术,都希望简单好用,如果技术太过于复杂,反而会提升使用门槛,吓跑用户) 事务模式 AT (AutomaticTransaction,对业务系统无侵入,省去了用的人很多编码的工作) ...

Appleyk的专栏 10万+

你了解MySQL?

开局一张图,内容全靠编 实例&&数据库傻傻分不清 数据库 就是一堆数据文件的集合,相当于一个大文件夹其中包含了各种格式的数据文件,不同的数据格式代表使用了不同的存储引擎,如我们经常使用的innoDB在磁盘上的存储格式就是.ibd文件,还有frm MYD MYI格式的,代表不同的存储引擎。如果当前的数据表出现问题,可以从这个数据文件执行恢复数据。需要特别注意的是存储引擎的粒度...

Chaos Awakening 217

Java程序员必读精选书籍分享,强烈推荐

Java程序员必读精选书籍分享!强烈推荐!

小白码上飞 1万+
上一篇: Java并发理论(一):指令重排序与数据依赖性
下一篇: 看了架构师的代码,切身感受到了代码可扩展性高的魅力
Java斗帝之路
博客等级 码龄7年 2392粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值