MySQL 第八期 事务ACID的分析

ACID四大原则

atomicity 原子性

定义:事务的所有操作,要么全部完成,要么全部不完成,不会结束在某个中间环节。


实现原理:Mysql通过WAL(写前日志)技术来实现的。我们知道Innodb引擎是提供了 redo_log 和undo_log的。同一事务下,如果一个失败了 就会通过undo_log回滚到修改前。


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

consistency 一致性

定义:事务开始之前和事务结束之后,数据库的完整性限制未被破坏。
一致性包含两部分:

  • 约束一致性:Mysql的外键约束以及唯一索引约束。所以约束一致性很好理解(显示约束)
  • 数据一致性:我认为是一个综合的规定,或者说是一个把握全局的规定,因为它是由原子性、持久性、隔离性共同保证的结果,而不是单单依赖于某一个技术。
  • 实例:比如对银行的转行事务,不管成功还是失败,事务后的存款的账户合是不会变的。
    总结: 一致性就是:应用系统从一个正确的状态到另一个正确的状态,而ACID就是说事务能够通过ACID来保证这个C的过程,C是目的 AID是手段

isolation 隔离性

定义:当多个事务并发访问数据库中的同一数据时,所表现出来的相互关系。


通俗定义:指的是一个事务的执行不能被其他事务干扰,即一个事务内部的操作即使用的数据对其他的并发事务时隔离的,锁和多版本控制就符合隔离性


隔离性的两种关键的技术:

  • 单版本控制-锁
    理解:锁用独占的方式来保证在只有一个版本的情况下事务之间相互隔离,所以锁可以理解为单版本控制。在mysql事务中,我们所熟知并且一直在用的 RR(可重复读)隔离级别,就是通过GAP锁来防止数据的写入的,所以它的并行度不够,容易导致死锁。
    扩展知识:现在比较流行的方式是 Row+RC模式的隔离级别,可以很大程度上提高数据库的读写并行度。(后期单独开一篇讲这个模式)
  • 多版本控制-MVCC
    只在读已提交和可重复读的隔离级别下出现。
    理解:是指在数据库中,为了实现高并发的数据访问,对数据进行多版本处理,并通过事务的可见性来保证事务能看到自己应该看到的数据版本。
    实现方式:通过Undo log日志的版本链和ReadView一致性视图来实现的。(后期会单独开一期讲MVCC)

总结:将会在下章中讲详细讲讲 四种隔离级别

durability 持久性

定义:事务完成之后,事务所做的修改进行持久化保存,不会丢失。
通俗定义:会将数据保存在磁盘当中。
理解:通过原子性可以保证逻辑上的持久性,通过存储引擎的数据刷盘可以保证物理上的持久性,持久性是保证了MySQL数据库的高可靠性,而不是高可用性。


涉及到实现的日志:redo log,bin log,


具体技术:MySQL的Innodb存储引擎,使用redo log保证了事务的持久性,当事务提交,必须先将事务的所有日志写入日志文件进行持久化,就是WAL(写前日志)机制,可以保证在宕机或者停电等情况发生后,已提交的事务不会丢失,这就是我们常说的 Crash-safe能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值