首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL 是如何实现 ACID 中的 D 的?

MySQL 的解决方案是:既写磁盘又写内存。...「页」,把整页数据都加载到内存,然后找到 user_id = 345981 的 row 数据,把内存中这行数据的 age 设置为 18。...未完待续 总结一下: redo log: innodb 在实现高性能写数据的同时,利用 redo log,实现了事务 ACID 中的D,持久性 binlog:MySQL 的数据还原、主从复制,都依赖 binlog...来实现 两阶段提交:为了保证 redo log 和 binlog 的一致性 看似一条简单的 update 语句,MySQL 在这背后其实做了很多事情。...MySQL 是一个把单机性能发挥到极致的数据库,这也是为什么出现了那么多分布式数据库,MySQL 依然是很多公司的首选的原因吧。 当然这篇文章也只是个引子,很多细节,还没有展开。

91630

MySQL 是如何实现 ACID 的?

但你知道 MySQL 是通过什么技术手段来实现的吗? ACID 简介 先来简单回顾一下 ACID 的定义: 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。...PS:本文基于 InnoDB 持久性 我们知道程序修改数据的时候,是先将数据从磁盘加载到内存,然后修改完再由内存写回磁盘。持久化其实就是将内存里的数据写入磁盘。...因此,持久性的关键就在于如何保证数据可以由内存顺利写入磁盘。...MySQL 给出的方案是 WAL(Write Ahead Log)机制。WAL 翻译过来就是先写日志的意思。这个日志就是 redo log。...写 redo log 和写表的区别就在于随机写和顺序写。MySQL 的表数据是随机存储在磁盘中的,而 redo log 是一块固定大小的连续空间。而磁盘顺序写入要比随机写入快几个数量级。

1K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL 是如何实现 ACID 的?

    ACID MySQL 作为一个关系型数据库,以最常见的 InnoDB 引擎来说,是如何保证 ACID 的。 (Atomicity)原子性:事务是最小的执行单位,不允许分割。...那么不同的隔离级别,隔离性是如何实现的,为什么不同事物间能够互不干扰?答案是 锁 和 MVCC。 锁 先来说说锁, MySQL 有多少锁。 粒度 从粒度上来说就是表锁、页锁、行锁。...行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。 行锁的种类 在 InnoDB 事务中,行锁通过给索引上的索引项加锁来实现。...总结 MySQL 都很熟, ACID 也知道是个啥,但 MySQL 的 ACID 怎么实现的?...参考 MVCC 实现原理 MySQL 中的锁 MySQL 事务中 ACID 实现原理 深入 MySQL 事务

    1K20

    MySQL是如何实现事务ACID的?

    对数据库中数据的改变是持久的,即使数据库发生故障。 接下来就介绍下,MySQL在innoDB引擎下是事务特性的 3隔离性 为什么要先说隔离性呢?...幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。...答案是 锁 和 MVCC。 MySQL中的锁从粒度上来说分为表锁、页锁、行锁。 表锁有意向共享锁(IS)、意向排他锁(IX)、自增锁等。...隔离性的MVCC其实就是依靠它来实现的,原子性也是。实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行的sql语句。...更新时,先改内存中的数据页,将更新操作写入redo log日志,此时redo log进入prepare状态,然后通知MySQL Server执行完了,随时可以提交,MySQL Server将更新的SQL

    98120

    MySQL是如何实现事务ACID的?

    对数据库中数据的改变是持久的,即使数据库发生故障。 接下来就介绍下,MySQL在innoDB引擎下是事务特性的 3隔离性 为什么要先说隔离性呢?...答案是 锁 和 MVCC。 MySQL中的锁从粒度上来说分为表锁、页锁、行锁。 表锁有意向共享锁(IS)、意向排他锁(IX)、自增锁等。...隔离性的MVCC其实就是依靠它来实现的,原子性也是。实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行的sql语句。...更新时,先改内存中的数据页,将更新操作写入redo log日志,此时redo log进入prepare状态,然后通知MySQL Server执行完了,随时可以提交,MySQL Server将更新的SQL...总结 MySQL事务应该大家都知道,但是实现原理可能就不是那么清楚,希望本文能对事务的了解有所帮助。 今天多学一点知识,明天就少说一句求人的话

    66510

    MySQL是如何实现事务的ACID

    前言 最近在面试,有被问到,MySQL的InnoDB引擎是如何实现事务的,又或者说是如何实现ACID这几个特性的,当时没有答好,所以自己总结出来,记录一下。...MySQL的InnoDB引擎是靠undo log(回滚日志)来实现的,undo log能够保证在事务回滚时,能够撤销所有已经执行成功的SQL。...第二点层次上的区别: redo log是存储引擎InnoDB实现的(MyISAM就没有redo log),而binlog是在MySQL服务器层面存在的任何其他存储引擎也有binlog。...对于隔离性的,我们要分两种情况进行讨论: 一个事务中的写操作对另一个事务中的写操作的影响; 一个事务中的写操作对另一个事务中的读操作的影响; 首先,事务间的写操作其实是靠MySQL的锁机制来实现隔离的...MVCC的主要是靠在每行记录上增加隐藏列和使用undo log来实现的,隐藏列主要包括,改行数据创建的版本号(递增的),删除时间,指向undo log的指针等。 那么MVCC是如何保证读写隔离的呢?

    1.4K10

    MySQl中的乐观锁是怎么实现的

    专栏持续更新中:MySQL详解 前言 mysql中的乐观锁是怎么实现的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。...即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。...缺点: 需要注意的是,乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性,如在上例中,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户余额更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中...二、如何实现乐观锁呢,一般来说有以下2种方式 2.1、使用数据版本(Version)记录机制实现 这是乐观锁最常用的一种实现 方式。何谓数据版本?...2.2、乐观锁定的第二种实现方式和第一种差不多 同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳 (timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比

    28910

    MySQL事务的隔离性是如何实现的?

    并发场景 最近做了一些分布式事务的项目,对事务的隔离性有了更深的认识,后续写文章聊分布式事务。今天就复盘一下单机事务的隔离性是如何实现的? 「隔离的本质就是控制并发」,如果SQL语句就是串行执行的。...是通过锁和隔离级别对MySQL进行并发控制的」 MySQL中的锁 行级锁 InnoDB存储引擎中有如下两种类型的行级锁 「共享锁」(Shared Lock,简称S锁),在事务需要读取一条记录时,需要先获取改记录的...「这两种隔离级别是通过MVCC(多版本并发控制)来实现的,本质就是MySQL通过undolog存储了多个版本的历史数据,根据规则读取某一历史版本的数据,这样就可以在无锁的情况下实现读写并行,提高数据库性能...」 「那么undolog是如何存储修改前的记录?」...好了,我们知道了版本可见性的获取规则,那么是怎么实现读已提交和可重复读的呢?」

    1.9K30

    MySQL事务的隔离性是如何实现的?

    并发场景 最近做了一些分布式事务的项目,对事务的隔离性有了更深的认识,后续写文章聊分布式事务。今天就复盘一下单机事务的隔离性是如何实现的? 「隔离的本质就是控制并发」,如果SQL语句就是串行执行的。...是通过锁和隔离级别对MySQL进行并发控制的」 MySQL中的锁 行级锁 InnoDB存储引擎中有如下两种类型的行级锁 「共享锁」(Shared Lock,简称S锁),在事务需要读取一条记录时,需要先获取改记录的...「这两种隔离级别是通过MVCC(多版本并发控制)来实现的,本质就是MySQL通过undolog存储了多个版本的历史数据,根据规则读取某一历史版本的数据,这样就可以在无锁的情况下实现读写并行,提高数据库性能...」 「那么undolog是如何存储修改前的记录?」...好了,我们知道了版本可见性的获取规则,那么是怎么实现读已提交和可重复读的呢?」

    3.7K30

    MySQL 中的数据排序是怎么实现的?

    在 MySQL 中,数据排序是通过 ORDER BY 子句来实现的。ORDER BY 子句可以用于对查询结果进行排序,可以根据一个或多个列来进行排序,并且可以指定每个列的排序方向(升序或降序)。...是你希望选择的列。table_name 是你查询的表名。ORDER BY 后面跟着你希望用来排序的列。ASC 表示升序排序(默认),DESC 表示降序排序。...单列排序SELECT * FROM employeesORDER BY salary ASC;这条查询语句将返回 employees 表中的所有记录,并按 salary 列升序排序。...性能考虑索引:如果排序的列上有索引,MySQL 可以利用索引来加速排序操作。例如,如果 salary 列上有索引,上述查询可能会更快。...使用覆盖索引:确保查询的所有列都在索引中,这样 MySQL 可以直接从索引中获取数据,而不需要回表查询。

    7300

    MySQL是如何实现可重复读的?

    简单理解一下可重复读 可重复读是指:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。 我们可以简单理解为:在可重复读隔离级别下,事务在启动的时候就”拍了个快照“。...注意,这个快照是基于整个库的。 这时,你可能就会想,如果一个库有 100G,那么我启动一个事务,MySQL就要拷贝 100G 的数据出来,这个过程得多慢啊。可是,我平时的事务执行起来很快啊。...实际上,我们并不需要拷贝出这 100G 的数据。我们来看下”快照“是怎么实现的。 拍个快照 InnoDB 里面每个事务都有一个唯一的事务 ID,叫作 transaction id。...表示这个版本在事务启动时还未提交,不可见; 若 trx_id 不在数组中,表示这个版本在事务启动时已经提交,可见。...InnoDB 就是利用 undo log 和 trx_id 的配合,实现了事务启动瞬间”秒级创建快照“的能力。

    2.2K11

    Java中的Lambda是如何实现的

    在上面的字节码中,我们可以看到一个名为 lambdamain0 的方法,该方法是在编译阶段自动生成的,其对应于示例源码中的lambda方法体。...在main方法的字节码中,invokedynamic是整个lambda实现的关键,不过由于该字节码在JVM中的实现逻辑非常复杂,在这里我们就不看具体代码了,只说下大致思路。...该字节码的最终目的是为了创建一个对象,且该对象要实现java.util.function.Consumer接口,这样这个对象才可以赋值给上面示例源码中的 Consumer c 变量。...那这个对象对应的类是哪里来的呢?对,也是动态生成的。...依据上面的示例,我们再来总结下lambda是如何实现的: 在编译阶段,javac会自动生成一个lambdamain0方法,该方法对应了lambda的方法体。

    1.1K30

    JS中setTimeout是如何实现的

    我们知道 Javascript引擎是单线程的,而setTimeout方法的作用是延后执行目标代码,同时还可以继续往下执行 setTimeout是如何实现的?...这涉及到了浏览器内核的事件循环模型,在Javascript引擎之外,有一个任务队列,当执行到setTimeout时,延时方法会交给内核其他模块处理(与执行引擎主线程独立),当延时方法到达触发条件,这一延时方法被添加至任务队列里...,执行引擎在主线程方法执行完毕后,会从任务队列中顺序获取任务来执行,这一过程是一个不断循环的过程,称为事件循环模型 下面通过一段示例代码,看一下整个执行过程 console.log('1'); setTimeout...(2)setTimeout test入栈执行 交由webapis处理 ? (3)log('3')入栈执行 ?...(4)在setTimeout方法执行5秒后,timer模块检测到延时处理方法到达触发条件,于是将延时处理方法加入任务队列 ?

    3.4K80

    MySQL中insertOrUpdate的功能如何实现的

    insertOrUpdate 在我们日常使用中比较常见,那么它是如何实现的呢,不知道大家有没有考虑过呢? 在 MySQL 中,可采用INSERT INTO ......ON DUPLICATE KEY UPDATE语句实现 insertOrUpdate 功能。 值得留意的是,在出现重复键时,会在先前索引值和当前值之间添加临时键锁,这可能导致死锁。...举个例子: 设想有一张 student 表,包括 id、name 和 age 三列,其中 id 是主键。现在要插入一条数据,若该数据的主键已存在,则更新该数据的姓名和年龄,否则插入该数据。...在此过程中,数据库会检查表中是否存在与新插入行具有相同的唯一索引或主键的记录。 冲突处理:如果不存在冲突的唯一索引或主键,新行将被正常插入。...这是因为 MySQL 在尝试插入新记录时,会先分配一个新的自增主键值,无论后续是插入成功还是执行更新操作,这个主键值都已经被分配并且会增加。

    48010

    直播卖货小程序源码中,商品分类页面是如何实现的

    在直播卖货小程序源码中,一般都包含商品分类页面,如下图,那么这个页面是如何通过代码实现的呢?下面,小编以iOS版本的开发过程为例,来讲述下实现过程。...图片1.png 左边一级分类使用tableview来展示,右边的耳机分类使用collectionview来展示,主要就是实现一二级分类的联动。下面主要讲下点击和滑动。...1、左侧一级分类的点击实现 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath...), dispatch_get_main_queue(), ^{             isClickLeft = NO;         });     } } 2、在collectionview的代理方法中更改一级分类的选中...以上,就是直播卖货小程序源码中,商品分类页面的实现过程。 声明:以上内容为作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任。

    1.2K20
    领券