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

面经分享 | 面试官问我谈谈对事务隔离机制的理解?我是这样回答的!

在转账过程中,程序会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的。...在整个程序更新数据过程中,这时就要用到“事务”这个概念了。 简单的说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败!...Repeatable read:俗称可重复读,指的是一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,同时当其他事务在未提交时,变更是不可见的。...首先说读未提交,它是性能最好,也可以说它是最野蛮的方式,因为它压根儿就不加锁,所以根本谈不上什么隔离效果,可以理解为没有隔离。...答案是,在不需要的时候才删除。也就是说,系统会判断,当没有事务再需要用到这些回滚日志时,回滚日志会被删除。 什么时候才不需要了呢?就是当系统里没有比这个回滚日志更早的 read-view 的时候。

33830

我,卷王!

有的,如果数据库的引擎支持的事务支持可重复读的隔离级别,那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作...MDL 不需要显示调用,那它是在什么时候释放的? MDL 是在事务提交后才会释放,这意味着事务执行期间,MDL 是一直持有的。...也就是,当执行插入、更新、删除操作,需要先对表加上「意向共享锁」,然后对该记录加独占锁。...那么,一个事务在持有 AUTO-INC 锁的过程中,其他事务的如果要向该表插入语句都会被阻塞,从而保证插入数据时,被 AUTO_INCREMENT 修饰的字段的值是连续递增的。...等数据库系列文章写完后,后面也是会像图解网络和图解系统那样整理成 pdf。 不过,在还没写完之前,大家可以在我的公众号菜单,看到往期的数据库文章。 这个列表里的文章会一直更新。

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

    SQLServer 学习笔记之超详细基础SQL语句 Part 7

    AS sql语句 29.2执行存储过程 对存储在服务器上的存储过程,可以使用exectue命令或者其名称执行 29.3查看存储过程 对用户建立存储过程,可以使用对象资源管理器或系统存储过程查看该存储过程的定义...AS SELECT @getNum = 学号 FROM 学生 WHERE 姓名= @setName --执行 ----该语句的执行,看不到结果,但是如果用.net等编程语言调用时则会看到效果...INSERTED表:用来存储INSERT和UPDATE语句所影响的行的副本。 意思就是在INSERTED表中临时保存了被插入或被更新后的记录行。...意思是在DELETED表中临时保存了被删除或被更新前的记录行。在执行DELETE或UPDATE语句时,行从触发器表中删除,并传到DELETED表中。...所以当表中某条记录的某项值发生变化时,变化前的值已经通过系统自动创建的临时表DELETED表和INSERTED表保存了被删除行或插入的记录行的副本。我么可以从这两个表中查询出变化前的值并赋给变量。

    62410

    使用触发器

    触发器的类型 触发器由以下内容定义: 导致它执行的事件类型。触发器可以是单个事件触发器或多事件触发。定义单个事件触发器以在指定表上发生插入,更新或删除事件时执行。...定义多事件触发器以执行当在指定的表中发生多个指定的事件中的任何一个时执行。可以使用类定义或创建触发命令定义插入/更新,更新/删除或插入/更新/删除多事件触发器。...例如,如果表T1有一个对表T2执行插入操作的触发器,表T2也有一个对表T1执行插入操作的触发器。 当表T1有一个调用例程/过程的触发器,并且该例程/过程执行对T1的插入操作时,也可以发生递归。...触发器代码可以引用变量%oper,该变量包含触发触发器的事件(插入、更新或删除)的名称。...SQL和对象行为同步而实现回调方法, 在对象访问期间没有拔出触发器 默认情况下,SQL对象使用%Storage.Persistent存储。

    1.7K10

    Milvus 的十大使用误区,你“踩”中了几个?

    在社区里我经常被问到的一个问题是:“Milvus 什么时候可以支持 GPU?”这时候我一般会顺势问一句:“你们为什么需要使用 GPU 呢?”得到的答案经常是“使用 GPU 肯定比 CPU 算得快!”...这时候,计算过程中将不可避免地进行内存数据和显存数据的置换,由于数据置换时间的存在,总体的搜索速度也就不是那么快了。...当我们在调用 delete() 接口的时候,Milvus 内部其实不会真正马上将磁盘上 segment 里的数据做清除,而是通过标记删除的方式,将对应的 entity 打上删除标记,下次搜索的时候直接将其过滤掉...而图数据库(Graph Database)是指以图表示、存储和查询数据的一类数据库。...#误区9 为了保证新插入的数据建上索引并被搜到,每次插入后都要调用 create_index() 和 load() 接口 很多小伙伴为了保险,每次插入完数据后,都会调用一次 create_index(

    3.1K10

    【React】383- React Fiber:深入理解 React reconciliation 算法

    (因为它们会影响其他组件,并且在渲染期间无法完成。) ” 您可以看到大多数state和props更新将如何导致副作用。...需要记住的是,副作用列表是运行render阶段的结果。渲染的重点就是确定需要插入、更新或删除的节点,以及哪些组件需要调用其生命周期方法。...在标记为Deletion副作用的节点上调用componentWillUnmount生命周期。 执行所有DOM插入、更新、删除操作。 将finishedWork树设置为current。...在调用变更前方法getSnapshotBeforeUpdate之后,React 会在树中提交所有副作用,这会通过两波操作来完成。 第一波执行所有 DOM(宿主)插入、更新、删除和 ref 卸载。...在第二波,React 调用所有其他生命周期方法和引用回调。这些方法单独传递执行,从而保证整个树中的所有放置、更新和删除能够被触发执行。

    2.5K10

    MySQL 日志:undo log、redo log、binlog

    增删改”语句后,我们可以及时在数据库表看到“增删改”的结果了。...如下图: 回滚事务 每当 InnoDB 引擎对一条记录进行操作(修改、删除、新增)时,要把回滚时需要的信息都记录到 undo log 里,比如: 在插入一条记录时,要把这条记录的主键值记下来,这样之后回滚时只需要把这个主键值对应的记录删掉就好了...; 在删除一条记录时,要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了; 在更新一条记录时,要把被更新的列的旧值记下来,这样之后回滚时再把这些列更新为旧值就好了。...MySQL 主从复制过程 MySQL 集群的主从复制过程梳理成 3 个阶段: 写入 Binlog:主库写 binlog 日志,提交事务,并更新本地存储数据。...具体详细过程如下: MySQL 主库在收到客户端提交事务的请求之后,会先写入 binlog,再提交事务,更新存储引擎中的数据,事务提交完成后,返回给客户端“操作成功”的响应。

    2.4K43

    存储过程和触发器

    一、定义        存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数...(2)、IN类型参数一般只用于传入,在调用过程中一般不作为修改和返回         (3)、如果调用存储过程中需要修改和返回值,可以使用OUT类型参数 通过一个实例来演示: 需求:编写存储过程,传入id...(9):                              图(9)   概括:         1、传出参数:在调用存储过程中,可以改变其值,并可返回;         2、out是传出参数...3).存储过程的可变参数INOUT         需求:调用存储过程时,传入userId和userName,既是传入,也是传出参数。...九、存储过程游标的使用     1、什么是游标         游标是保存查询结果的临时区域     2、示例     需求:编写存储过程,使用游标,把users表中 id为偶数的记录逐一更新用户名 create

    78230

    Shopee 面试体验拉满!

    全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。...意向锁:当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。意向锁的目的是为了快速判断表里是否有记录被加锁。...这意味着,如果其他事务在此期间修改了数据,正在运行的事务仍然看到的是它开始时的数据状态,从而实现了非阻塞读操作。...插入和删除操作的效率不同:ArrayList在尾部的插入和删除操作效率较高,但在中间或开头的插入和删除操作效率较低,需要移动元素。...使用场景:ArrayList适用于频繁随机访问和尾部的插入删除操作,而LinkedList适用于频繁的中间插入删除操作和不需要随机访问的场景。

    21010

    终究还是拿下字节!强度拉满!

    可以看到,这个查找过程就是在多个层级上跳来跳去,最后定位到元素。当数据量很大时,跳表的查找复杂度就是 O(logN)。 跳表的时间复杂度是多少?...Redis 和 MySQL 如何保证一致性 可以采用「先更新数据库,再删除缓存」的更新策略+过期时间来兜底。 我们用「读 + 写」请求的并发的场景来分析。...因为缓存的写入通常要远远快于数据库的写入,所以在实际中很难出现请求 B 已经更新了数据库并且删除了缓存,请求 A 才更新完缓存的情况。...所以,「先更新数据库 + 再删除缓存」的方案,是可以保证数据一致性的。 而且为了确保万无一失,还给缓存数据加上了「过期时间」,就算在这期间存在缓存数据不一致,有过期时间来兜底,这样也能达到最终一致。...; 在删除一条记录时,要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了; 在更新一条记录时,要把被更新的列的旧值记下来,这样之后回滚时再把这些列更新为旧值就好了。

    18610

    ClickHouse系列--Mutations操作:数据的删除和修改

    4.该操作没有原子性保证:被mutation操作的数据会被替换,在mutation期间开始执行的SELECT查询能看到所有已经完成mutation的数据,以及还没有被mutation替换的数据。...6.和insert的关系:mutation操作也会部分的和Insert操作一起排序 - 在mutation提交之前插入的数据会参与mutation操作,在mutation提交之后的插入的数据则不会参与mutation...这个txt文件是一个日志文件,记录了update或者delete操作的执行语句和时间。 以数据删除为例:数据的删除过程,是以数据表的每个分区目录为单位,将所有目录重写为新的目录。...数据在重写的过程中会将需要删除的数据移除掉。旧的数据目录并不会立即删除,而是会被标记为非激活状态(active为0)。...4.实践 亲测一条sql更新400万条记录中的一个字段时,数据库会崩溃。在后续超过2小时的时间,数据库访问都是超时,偶尔可以执行最简单的sql。没办法,只能把表删除了重建。

    6K20

    2024 Mysql基础与进阶操作系列之MySQL触发器详解(20)作者——LJS

    触发器与存储过程的对比与选择 触发器与存储过程的对比与选择详解说明表 触发器 自动触发: 触发器是与数据操作紧密关联的,当满足触发条件时自动执行,无需手动调用 数据驱动: 触发器通过对数据库中的特定表进行监视...,对数据操作作出响应,可以在插入、更新或删除数据时执行相应的操作 适用范围: 适用于需要在数据操作发生时自动执行的简单逻辑,如验证、约束、日志记录等。...触发器通常较轻量级,用于处理特定表上的少量逻辑 存储过程 手动调用: 存储过程是一段可由应用程序手动调用的代码块,需要显式调用才能执行 逻辑复杂性: 存储过程适用于较为复杂的业务逻辑,可以包含条件判断...、循环、事务控制等复杂逻辑结构 参数和返回值: 存储过程可以接受参数和返回结果,使其更加灵活和可配置,适合处理多样化的业务需求 应用层控制: 存储过程通常由应用程序来调用和管理,可以作为一个整体被多个应用程序共享和复用...要确保触发器的执行顺序符合预期,可以使用CREATE TRIGGER语句的BEFORE或AFTER关键字进行调整 触发器的影响范围 触发器是与表相关联的,且在表上的特定操作(例如插入、更新和删除)

    10810

    第23章、存储程序和视图

    本章讨论存储的程序和视图,这些数据库对象是根据存储在服务器上供以后执行的SQL代码定义的数据库对象。 存储的程序包括这些对象: 存储例程,即存储过程和函数。使用该CALL语句调用存储过程 。...过程没有返回值,但可以修改其参数供调用者稍后检查。它也可以生成返回给客户端程序的结果集。存储的功能与内置功能非常相似。您可以在表达式中调用它并在表达式评估期间返回一个值。 触发。...(过程和函数) 存储的例程是一组可存储在服务器中的SQL语句。...触发器定义为在语句插入,更新或删除关联表中的行时激活。这些行操作是触发事件。例如,可以通过 INSERT或LOAD DATA语句插入行,并为每个插入的行激活插入触发器。...触发器可以设置为在触发事件之前或之后激活。例如,可以在插入表的每一行之前或每更新一行之后激活触发器。 创建触发器:CREATE TRIGGER。

    1K30

    告别鸽子,从我做起

    回滚事务 可以看到,在事务没提交之前,MySQL 会先记录更新前的数据到 undo log 日志文件里面,当事务回滚时,可以利用 undo log 来进行回滚。...每当 InnoDB 引擎对一条记录进行操作(修改、删除、新增)时,要把回滚时需要的信息都记录到 undo log 里,比如: 在插入一条记录时,要把这条记录的主键值记下来,这样之后回滚时只需要把这个主键值对应的记录删掉就好了...; 在删除一条记录时,要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了; 在更新一条记录时,要把被更新的列的旧值记下来,这样之后回滚时再把这些列更新为旧值就好了。...,从库执行了这条更新语句,那么这一行 name 字段是新值 xiaolin,与主库的值不一致性; 可以看到,在持久化 redo log 和 binlog 这两份日志的时候,如果出现半成功的状态,就会造成主从环境的数据不一致性...如果想提升 binlog 组提交的效果,可以通过设置下面这两个参数来实现: binlog_group_commit_sync_delay= N,表示在等待 N 微妙后,直接调用 fsync,将处于文件系统中

    52421

    MySQL实战第十三讲-为什么表数据删掉一半,表文件大小不变?

    如下图所示 图 2 为插入数据导致页分裂: 可以看到,由于 page A 满了,再插入一个 ID 是 550 的数据时,就不得不再申请一个新的页面 page B 来保存数据了。...页分裂完成后,page A 的末尾就留下了空洞(注意:实际上,可能不止 1 个记录的位置是空洞)。 另外,更新索引上的值,可以理解为删除一个旧的值,再插入一个新值。不难理解,这也是会造成空洞的。...如下图 4 所示为Online DDL: 可以看到,与图 3 过程的不同之处在于,由于日志文件记录和重放操作这个功能的存在,这个方案在重建表的过程中,允许对表 A 做增删改操作。...而对于一个大表来说,Online DDL 最耗时的过程就是拷贝数据到临时表的过程,这个步骤的执行期间可以接受增删改操作。所以,相对于整个 DDL 过程来说,锁的时间非常短。...在 DDL 期间,如果刚好有外部的 DML 在执行,这期间可能会引入一些新的空洞。 在重建表的时候,InnoDB 不会把整张表占满,每个页留了 1/16 给后续的更新用。

    83421

    MySQL深入学习第十三篇-为什么表数据删掉一半,表文件大小不变?

    页分裂完成后,page A 的末尾就留下了空洞(注意:实际上,可能不止 1 个记录的位置是空洞)。 另外,更新索引上的值,可以理解为删除一个旧的值,再插入一个新值。不难理解,这也是会造成空洞的。...显然,花时间最多的步骤是往临时表插入数据的过程,如果在这个过程中,有新的数据要写入到表 A 的话,就会造成数据丢失。因此,在整个 DDL 过程中,表 A 中不能有更新。...可以看到,与图 3 过程的不同之处在于,由于日志文件记录和重放操作这个功能的存在,这个方案在重建表的过程中,允许对表 A 做增删改操作。这也就是 Online DDL 名字的来源。...而对于一个大表来说,Online DDL 最耗时的过程就是拷贝数据到临时表的过程,这个步骤的执行期间可以接受增删改操作。所以,相对于整个 DDL 过程来说,锁的时间非常短。...在 DDL 期间,如果刚好有外部的 DML 在执行,这期间可能会引入一些新的空洞。 在重建表的时候,InnoDB 不会把整张表占满,每个页留了 1/16 给后续的更新用。

    72620

    【愚公系列】《微信小程序与云开发从入门到实践》047-使用云数据库

    在页面的左侧可以看到,此工程模板默认创建了一个名为sales的数据库集合,此集合是通过云函数调用的方式创建的,关于云函数的部分这里暂且放下不谈,可以通过控制台手动地创建数据库集合。...通过这些数据类型,开发者可以在云数据库中灵活存储和处理各种形式的数据,满足不同的业务需求。...4.4 链式调用查询 在使用查询指令时,可以通过链式调用的方式组合多个查询条件,灵活实现复杂的查询需求。例如,可以同时使用 neq、gte 和 and 指令来查询符合多个条件的数据。...回档过程: 回档的过程需要一定的时间,具体的进度可以在数据库回档页面查看。 在回档期间,数据库的访问不受影响,但不能新建回档任务。...回档期间的注意事项 访问不受影响:虽然回档过程需要一定时间,但数据库的其他访问操作不会中断,用户可以继续进行数据读取和操作。 不能创建新的回档任务:在回档过程中,不能同时发起新的回档任务。

    13720

    MySQL 核心模块揭秘 | 14 期 | 回滚整个事务

    回滚整个事务时,事务执行过程中改变(插入、更新、删除)的数据都不要了,产生的 binlog 日志也就没有用了。 回滚整个事务,首先要进行的步骤就是 binlog 回滚。...= SQLCOM_ROLLBACK_TO_SAVEPOINT) error = mysql_bin_log.rollback(thd, all); return error; } 从代码可以看到...这其实取决于回滚操作是怎么进行的。 我最初理解的回滚操作,是把事务执行过程中改变(插入、更新、删除)的记录恢复原样,就像事务什么都没干过一样。 然而,实际情况没有这么理想。...执行 commit 语句时,因为有 binlog 和 InnoDB 两个存储引擎,需要使用二阶段提交。 事务执行过程中改变(插入、更新、删除)记录,会产生 binlog 日志。...第 2 步,执行 InnoDB 回滚操作,会把事务执行过程中改变(插入、更新、删除)的记录恢复原样(至少从逻辑上来看是这样的)。 最后,还会提交 InnoDB 事务,让回滚操作对数据页的修改生效。

    15110

    技术分享 | Update更新慢、死锁等问题的排查思路分享

    有两个作用:提供回滚和 MVCC。 事务因为某些原因需要回滚时,可以借助 Undo 日志进行回滚,保证事务的一致性 在事务的不同隔离级别需要通过Undo log 实现。...当读取某一行加锁的数据时,可以通过 Undo log 实现(比 如:RR 级别),事务不结束,Undo log 就不删除 Undo log 的存储方式是用段(segment)记录在表空间中。...5、字段值在 BP 缓冲池更新成功后,对应的数据页就是脏页。 什么时候落盘到 redo log 中。...1)事务提交分为 prepare 阶段与 commit 阶段(两阶段提交) 事务的 commit 操作在存储引擎和 server 层采用内部 XA。...对于 delete+insert 方式,标记删除的记录清理删除标记,同时把插入的聚集索引和二级索引记录也会删除。

    2.7K41
    领券