你可能知道事务的四大特性,但是你不一定知道事务的实现原理(代码片段)

author author     2022-12-24     402

关键词:

说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景:

面试官:"事务的四大特性是什么?"
我:"ACID,即原子性(Atomicity)、隔离性(Isolation)、持久性(Durability)、一致性(Consistency)!"
面试官:"在 MySQL 数据库的 InnoDB 引擎是怎么实现这四大特性的?"
我:"这个...这个....,还真没有了解过哎"
面试官:"那我们就先这个吧,先回去吧,我们会通知你的~"

这可能是比较常见的面试场景了,你也许回答到了事务的四大特性,但是不一定知道他的实现原理。今天我们就来一起打卡事务的四大特性和实现原理,对于原理的实现,这篇文章只是粗略的介绍一下,更多的细节可以关注我后续的文章。

数据库的事务有四大特性:原子性、隔离性、永久性、一致性,下面将介绍这四大特性的定义和在 InnoDB 引擎中是怎么实现的。

原子性

定义

一次操作是不可分割的,要么全部成功,要么全部失败。比如我们的转账操作,不允许出款方成功,收款方失败这种情况,要么都成功,要么多失败,不可能出现中间状态。

实现

InnoDB 引擎使用 undo log(归滚日志)来保证原子性操作,你对数据库的每一条数据的改动(INSERT、DELETE、UPDATE)都会被记录到 undo log 中,比如以下这些操作:

  • 你插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的时候只需要把这个主键值对应的记录删掉就好了。
  • 你删除了一条记录,至少要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了。
  • 你修改了一条记录,至少要把修改这条记录前的旧值都记录下来,这样之后回滚时再把这条记录更新为旧值就好了。

当事务执行失败或者调用了 rollback 方法时,就会触发回滚事件,利用 undo log 中记录将数据回滚到修改之前的样子。

更多关于 undo log 的信息,后面再单独开一篇文章打卡。

隔离性

定义

多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

实现

隔离性可能会引入脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)等问题,为了解决这些问题就引入了“隔离级别”的概念。

SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)

  • 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交:一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读:?一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 串行化:?顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

SQL标准中规定,针对不同的隔离级别,并发事务可以发生不同严重程度的问题,具体情况如下:

隔离级别 脏读 不可重复读 幻读
读未提交 可能 可能 可能
读提交 不可能 可能 可能
可重复读 不可能 不可能 可能
串行化 不可能 不可能 不可能

上面就是几种隔离级别可能出现的并发问题,但是有必要说一下,你隔离得越严实,效率就会越低。

InnoDB 引擎是如何保证隔离性的?利用锁和 MVCC 机制。这里简单的介绍一下 MVCC 机制,也叫多版本并发控制,在使用 READ COMMITTD、REPEATABLE READ 这两种隔离级别的事务下,每条记录在更新的时候都会同时记录一条回滚操作,就会形成一个版本链,在执行普通的 SELECT 操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。

持久性

定义

事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

实现

要保证持久性很简单,就是每次事务提交的时候,都将数据刷磁盘上,这样一定保证了安全性,但是要知道如果每次事务提交都将数据写入到磁盘的话,频繁的 IO 操作,成本太高,数据库的性能极低,所以这种方式不可取。

InnoDB 引擎是怎么解决的?InnoDB 引擎引入了一个中间层来解决这个持久性的问题,我们把这个叫做 redo log(归档日志)

为什么要引入 redo log?redo log 可以保证持久化又可以保证数据库的性能,相比于直接刷盘,redo log 有以下两个优势:

  • redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。
  • redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。

InnoDB 引擎是怎么做的?当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 ?redo log 里面,并更新内存,这个时候更新就算完成了。当数据库宕机重启的时候,会将 redo log 中的内容恢复到数据库中,再根据 undo log和 binlog 内容决定回滚数据还是提交数据。

更多 redo log,后面我打算单独写一篇文章。

一致性

定义

一致性简单一点说就是数据执行前后都要处于一种合法的状态,比如身份证号不能重复,性别只能是男或者女,高考的分数只能在0~750之间,红绿灯只有3种颜色,房价不能为负的等等, 只有符合这些约束的数据才是有效的,比如有个小孩儿跟你说他高考考了1000分,你一听就知道他胡扯呢。数据库世界只是现实世界的一个映射,现实世界中存在的约束当然也要在数据库世界中有所体现。如果数据库中的数据全部符合现实世界中的约束(all defined rules),我们说这些数据就是一致的,或者说符合一致性的。

实现

要保证数据库的数据一致性,要在以下两个方面做努力:

  • 利用数据库的一些特性来保证部分一致性需求:比如声明某个列为NOT NULL?来拒绝NULL值得插入等。
  • 绝大部分还是需要我们程序员在编写业务代码得时候来保证

以上就是我今天要分享的内容,希望这篇文章对你的学习或者工作有所帮助,感谢您的阅读,如果您觉得文章不错欢迎点赞+评论,感谢。

别再说你不知道分布式事务了(代码片段)

简介我们都知道Seata是一个分布式事务的解决方案,今天我们就来带大家了解一下什么是分布式事务,首先我们先来了解一下基础的知识——事务,我们先来了解一下事务的概念是什么。基本概念事务四部分构成——A... 查看详情

数据库四大特性和事务隔离级别

...别可以通过“排他写锁”实现。3)避免了更新丢失,却可能出现脏读。也就是说事务B读取到了事务A未提交的数据。(读未提交:一个事务写数据时,只允许其他事务对这行数据进行读,所以会出现脏读,事务T1读取T2未提交的... 查看详情

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

...级别:隔离级别脏读不可重复读幻读未提交读ReadUncommitted可能可能可能已提交读ReadCommitted不可能可能可能可重复读RepeatableRead不可能不可能可能序列化Serializable不可能不可能不可能原子性实现MySQL数据库事务的原子性通过undolog实... 查看详情

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

...级别:隔离级别脏读不可重复读幻读未提交读ReadUncommitted可能可能可能已提交读ReadCommitted不可能可能可能可重复读RepeatableRead不可能不可能可能序列化Serializable不可能不可能不可能原子性实现MySQL数据库事务的原子性通过undolog实... 查看详情

事务----四大特性(代码片段)

... 原子性:这个针对于 一个事务而言。一个事务中可能包含很多的 “操作”。这些 &ld 查看详情

事务的四大特性(acid)

...部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。2.一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。3.隔离性(isolation):一个事务... 查看详情

分布式事务(seata)四大模式详解(代码片段)

...介绍和使用,感兴趣的小伙伴可以回顾一下《别再说你不知道分布式事务了!》最后小农也说了,下期会带给大家关于Seata中关于seata中AT、TCC、SAGA和XA模式的介绍和使用,今天就来讲解关于Seata中分布式四种模型的介绍。Seata分为... 查看详情

mysql系列你不知道的视图触发器存储过程函数事务索引语句(代码片段)

转自:http://www.cnblogs.com/suoning/p/5744849.html本章内容:视图、增/删/改/查触发器、增/删/改/查存储过程、增/删/改/查存储过程三种传参,pymysql怎么用?函数、增/删/改/查/return值内置函数事务索引!一、视图视图是查询命令结果构... 查看详情

事务的四大特性,传播行为以及应用场景(代码片段)

一、事务的四大特性:*ACID:原子性,一致性,隔离性,持久性*原子性:要不一起成功,要不一起回滚;*一致性:对数据的操作,数据总数不变;(转账业务A转账B20元,但是AB的总计还是原来的数值)*隔离性:一个事务不会影响另一... 查看详情

mysq数据库事务的四大特性:

...库事务的操作要么完全的地执行,要么完全的不执行,不可能执行其中的一部分。(如:增删改一条数据,整个事务要么提交成功,要么失败回滚)2,一致性:指对数据库的操作不提交, 查看详情

mysql事物四大特性和事物的四个隔离

...部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。隔离性(isolation):一个事务所... 查看详情

mysql事务和事务引发的问题

...日死。有点过分,但是是这个理儿。四大特性我们都知道,提到事务,就不能不提事务的四大特性,ACID,即原子性,一致性, 查看详情

对spring事务的一些误解

...本特征,五个隔离级别,七大传播特性。相信大多数人都知道这些东西,但是知道是一回事情,能用好真的是另一回事了。在使用Spring事务的时候,我曾遇到过几个比较严肃的问题,在这里我做一个自我总结。 问题一、propag... 查看详情

分布式事务(seata)四大模式详解(代码片段)

...和使用,感兴趣的小伙伴可以回顾一下《别再说你不知道分布式事务了!》最后小农也说了,下期会带给大家关于Seata中关于seata中AT、TCC、SAGA和XA模式的介绍和使用,今天就来讲解关于Seata中分布式四种模型的介绍。文... 查看详情

mybatis:深入对事务的理解

...还是可以巧妙的描述传播特性的)2、一说到事务,人们可能又会想起create、begi 查看详情

别再说你不知道分布式事务了(代码片段)

简介我们都知道Seata是一个分布式事务的解决方案,今天我们就来带大家了解一下什么是分布式事务,首先我们先来了解一下基础的知识——事务,我们先来了解一下事务的概念是什么。基本概念事务四部分构成——A... 查看详情

别再说你不知道分布式事务了(代码片段)

简介我们都知道Seata是一个分布式事务的解决方案,今天我们就来带大家了解一下什么是分布式事务,首先我们先来了解一下基础的知识——事务,我们先来了解一下事务的概念是什么。基本概念事务四部分构成——A... 查看详情

数据库事务的四大特性(acid)

...nsactionprocessing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。⑴原子性(Atomicity)第一个原子性,这个是最简单的。说的是一个事物内所有操作共同组成一个原子包,要么全部成功,要么全部失败。这是最... 查看详情