InnoDB秘籍:MVCC机制与行锁的深度探索(1)
前言
事务的起源可以追溯到 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 基于并发带来的异象,首次尝试对隔离级别进行统一定义。 写在前,读在后:脏读; 读在前,写在后:不可重复读; 读在前,写在后,再读:幻读。