InnoDB秘籍:MVCC机制与行锁的深度探索(1)

云掣YunChe2周前技术文章43


前言



事务的起源可以追溯到 6000 年以前,当时苏美尔人(Sumerians)就发明了事务处理和记录的方法。已知最早的记录是写在土块上的,上面写了皇家的税收、土地、谷物、牲畜、奴隶和黄金,明确地记下了每笔交易。


这种早期的系统已经具备了事务处理的关键特征。记录使用的土块和记号方式就是数据库,土块每次的加入都会造成数据状态的变化,在现在可以称为事务。


图片

PS:左图是苏美尔发明的 60 进位制,右图是考古发现的苏美尔人用于记录赋税的泥板。


事务是数据库关系系统中的一系列操作的一个逻辑单位。


这种基于土块的事务处理系统的技术演变了数千年,经历了纸莎草纸、羊皮纸、到我们现在用的纸张。在19世纪后期,出现了打孔卡片计算机系统,应用于1890 年美国人口普查的数据存储和记录。20 世纪前半叶,对事务处理的需求促进了打孔卡片计算机的发展,提升了其查询和更新速度,1 秒可以处理一张卡片,这种系统被应用于库存控制和记账。


到了 20 世纪后半叶,事务处理出现了重大的进展,发展了基于磁性存储介质的成批事务处理以及随后基于电子存储和计算机网络的联机事务处理。事务处理的速度呈几何倍增长,极大地促进了计算机工业的发展。

图片


今天,事务处理被应用于各个核心领域,典型使用场景包括:银行交易、电子订单、火车预定、股票交易、自动收款、作业和存货规划、记账等。随着事务技术的发展和广泛应用,对事务处理的性能安全要求也越来越高。数据库系统中事务处理机制,需要在满足性能的前提下,保证用户的数据操作动作对数据是安全的。


本篇文章,将介绍 MySQL InnoDB 引擎中的事务处理机制,探究它是如何保障用户数据操作的安全。




事务处理挑战




图片



01

事务机制处理的问题


上面提到的事务处理机制,是为了保证用户对数据库的操作对数据是安全的。如何保障事务安全呢?在 1970 年, IBM 研究员发表了《关系模型的数据库管理系统》一文,首次提出了ACID 事务模型。数据只有在带有 ACID 四个特性的事务处理机制的保障下,才可以被认为是安全的。


  • 原子性(Atomicity):事务被视为一个原子操作,要么全部执行成功,要么全部执行失败,如果事务中的任何一部分操作失败,那么整个事务将回滚到初始状态,不会留下部分执行的结果。

  • 一致性(Consistency):事务要保证数据库整体数据的完整性和业务数据的一致性,事务成功则提交整体数据修改,事务错误则回滚到数据回到原来的状态。

  • 隔离性(Isolation):隔离性是说两个事务的执行都是独立隔离开来的,事务之间不会相互影响,多个事务操作一个对象时会以串行等待的方式保证事务相互之间是隔离的。

  • 持久性(Durability):一旦事务提交成功,其结果将永久保存在数据库中,并且对于系统故障或崩溃是持久的。即使在系统故障后进行恢复,数据库也能保持事务的持久性。


事务模型是商业世界运作的基石,主要体现在交易处理电子化。作为一个软件系统,数据库系统会遭遇一些故障,如我们常说的硬件故障、系统故障、介质故障等。对于数据库系统,因为数据实在太为重要,数据库系统应该能够保证在出现故障时,数据的流动依然满足 ACID 特性。


02

并发事务带来的问题

在 1990 年以前,数据库是非常简单的,隔离级别以及并发控制是没有标准的,用户需要处理无数的数据异常情况。为了解决这个问题,ASNI 美国国家标准学会推出 SQL-92 standard 基于并发带来的异象,首次尝试对隔离级别进行统一定义。

图片

  • 写在前,读在后:脏读;

  • 读在前,写在后:不可重复读;

  • 读在前,写在后,再读:幻读。


相关文章

一条sql 在MySQL中是如何执行的

在 MySQL 中,SQL 查询的执行涉及多个内存区域和处理步骤,以确保查询能够高效地执行和返回结果。以下是 SQL 查询在 MySQL 中执行时通常会经过的内存路径:    &n...

Kubernetes源码解读(二)--DeltaFIFO源码分析

Kubernetes源码解读(二)--DeltaFIFO源码分析

1、Queue接口与DeltaFIFO的实现1.1、Queue和Store接口接口和结构体先相关代码类似 workqueue 里的队列概念,这里也有一个队列,Queue 接口定义在 client-go...

kubernetes实战详解

kubernetes实战详解

一、k8s是什么?1、Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统2、生产级别的容器编排系统3、PaaS平台二、容器是什么?或者说docker是什么?1、容器就是一个沙箱C...

 MySQL性能优化(十)in参数列表过长导致的性能问题

MySQL性能优化(十)in参数列表过长导致的性能问题

有时候可能有人会问:where条件中使用in和or有什么区别,哪种写法性能更好?in参数个数有没有限制?下面就是一个由于in参数列表过长导致的性能问题。一个例子当时使用的是mysql 5.6版本SEL...

MySQL运维实战之备份和恢复(8.7)将数据库恢复到指定时间点的另外一种方法

使用mysql原生复制功能实现时间点恢复使用mysqlbinlog解析并执行binlog是实现mysql时间点恢复的一种常用的方法。这里提供另外一种实现时间点恢复的方法:使用mysql的复制功能来实现...

canal原理及使用

canal原理及使用

什么是canalcanal,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。这里我们可以简单地把canal理解为一个用来同步增量数据的一个工具。工作原理MySQL主备复制原理M...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。