MySQL事务处理:ACID属性基础与实现概览

前言

​ 本文核心思想就是介绍一下 Mysql ACID 的实现,至于事务、锁、redo 的底层结构及实现原理,后面会单独出文章介绍。之所以这样是不希望一篇文章过长,在闲暇时间就可轻易掌握一个知识点。

ACID 介绍

​ ACID 是数据库管理系统(DBMS)中事务处理的四个关键属性的首字母缩写,它们分别是:

  1. 原子性(Atomicity): 原子性确保事务中的所有操作要么全部完成,要么全部不执行。如果事务中的任何一个操作失败,整个事务都会回滚到开始状态,就像这个事务从未执行过一样。这保证了不会出现只完成部分操作的情况。
  2. 一致性(Consistency): 一致性确保事务从一个一致的状态转换到另一个一臀的状态。在事务开始之前和结束之后,数据库的完整性约束都必须保持不变。这意味着事务执行的结果必须符合所有预定义的规则,例如数据类型、触发器、约束等。
  3. 隔离性(Isolation): 隔离性确保并发执行的事务彼此独立,事务的中间状态对其他事务不可见。这可以通过多种隔离级别实现,包括读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(serializable)。不同的隔离级别可能会导致不同的并发问题,如脏读、不可重复读和幻读。
  4. 持久性(Durability): 持久性确保一旦事务被提交,它对数据库的更改就是永久性的,即使系统发生故障也不会丢失。数据库系统通常通过将事务日志写入非易失性存储来实现这一点,以确保即使在系统崩溃后也能恢复已提交的事务。
ACID 实现原理
原子性(Atomicity)

​ MySQL通过undo日志实现原子性。Undo日志记录了事务中的每个修改操作,以便在事务失败时能够执行相应的逆向操作,将数据库状态恢复到事务开始之前。

undo log属于逻辑日志,它记录的是sql执行相关的信息。当发生回滚时,InnoDB会根据undo log的内容做与之前相反的工作:对于每个insert,回滚时会执行delete;对于每个delete,回滚时会执行insert;对于每个update,回滚时会执行一个相反的update,把数据改回去。

题外话:事务不宜过大。一方面:事务过大的时候会产生大量的回滚日志,事务回滚的时候由于要沿着undo链条进行回溯,过大的事务日志会导致这个时间过长从而影响性能。另一方面:事务过大会导致主从延迟边长。

隔离性(Isolation)

​ 隔离性通过锁机制和多版本并发控制(MVCC)来实现。锁机制确保事务在修改数据时,其他事务不能同时修改同一数据。MVCC允许在不阻塞读操作的情况下,通过维护数据的多个版本来实现并发控制。

​ 可以从一下两个方面对隔离性进行考虑:

  1. 事务并发写:使用锁保证
  2. 事务并发读写:使用 MVCC 进行保证
持久性(Durability)

​ 持久性由redo日志(重做日志)来保证。Redo日志记录了事务对数据库所做的修改,确保在系统故障后,这些修改可以被重新应用到数据库中。

一致性(Consistency)

​ 一致性(consistency)是目的,原子性(atomicity)、隔离性(isolation)、持久性(durability)是手段。即通过原子性、隔离性、持久性来保证一致性。

结论

​ ACID属性是数据库事务处理的黄金标准,MySQL通过其内部机制精心实现了这些属性。理解这些原理对于数据库管理员和开发者来说至关重要,它们有助于设计出高效、可靠的数据库应用。

Reference
  1. MySQL官方文档:MySQL ACID
  2. 博客园:深入学习MySQL事务:ACID特性的实现原理
  3. 李学团博客:[MySQL教程(十)—MySQL ACID 实现原理]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值