文章目录

  • 1.名词解释
  • 2.CSR前滚动作
  • 3.undo回滚

1.名词解释

Atomicity(原子性)——事务要么全部完成,要么全部不完成。

实现方式:利用 undo log
但事务执行出错或者用户 rollback,系统通过undo log回滚到事务开始前的状态。

Consistency(一致性)——事务开始前与结束后,数据的完整性不会被破坏。

实现方式:利用回滚、恢复、以及并发时的隔离性,实现一致性

Isolation(隔离性)——事务的修改在提交前,其他事务对它是不可见的,即事务之间不相互影响。

实现方式:利用锁机制和MVCC来隔离事务

Durability(持久性)——事务提交后,对数据修改的结果会准确存储在数据库中,是永久的。

实现方式:利用 redo log
在 redo log 持久化后,系统崩溃,可以通过 redo log 恢复数据。

redo log——重做日志,记录数据页发生的变化。

redo log buffer ——redo的内存区域。

ibd——(磁盘)存储数据行和索引。

(data)buffer pool——数据和索引的缓冲区。

LSN——日志序列号。每次mysql数据库启动,都会比较磁盘数据页和redo log的LSN,二者一致才能正常启动。

持久化——内存数据写入磁盘的动作。

WAL——日志优先写的持久化方式。

脏页——内存中修改,但还没有写入磁盘的内存页。

CKPT——检查点,将脏页刷写到磁盘的动作。

TXID——每个事务对应的编号。

2.CSR前滚动作

以下图为例,上方大矩形为内存,下方大矩形为磁盘区。
内存区的三个矩形从左到右依次是,“undo buffer”—“data buffer pool”—“redo buffer”
磁盘区的三个矩形从左到右依次是,“undo log”—“数据页ibd文件”—“redo log”

在事务开始前,磁盘数据页(红色圆形)有一行数据“a=1"。

1)begin 磁盘数据页的LSN=01
2)将磁盘数据页”a=1"调用到内存中,此时data buffer pool的LSN=01
3)修改数据,变成"a=2",此时data buffer pool的LSN=02。
4)在redo buffer中,会把a=1修改成a=2的变化写入redo日志中,并且LSN=02
5)将redo buffer中的redo log刷写到磁盘中,此时commit才算真正的成功,并且redo log会被打上commit的标记。
!!!!!!!!!然后断电了!!!!!!!!!
6)重新启动数据库,磁盘数据页的LSN=01与redo log(磁盘)的LSN=02不一致,判断出redo log中的数据没有写入到磁盘。此时会将二者都加载至内存,重新构造脏页。
7)触发CKPT,将脏页内容写入磁盘中,并且LSN=02,与磁盘的redo log的LSN=02保持一致。
8)Mysql正常启动。

ps.
当执行commit后,redo log会被刷写到磁盘;
同一时间进行的,还未提交的,在redo buffer的事务也会被刷写到磁盘中。

3.undo回滚

说明图片与2的图一样。

在事务开始前,磁盘数据页(红色圆形)有一行数据“a=1"。
修改操作前的事务是TXID=t0
begin开始后,TXID=t1

情况一:一切顺利,undo用不到。
1)begin 磁盘数据页的LSN=01 TXID=t1
2)将磁盘数据页”a=1"调用到内存中,此时data buffer pool的LSN=01,同时undo log中也记录a=1 TXID=t1(修改前状态)。
3)然后就是前滚操作(同上),在redo buffer和磁盘redo log中也有TXID=t1的记录,commit执行成功,数据写入磁盘。
4)undo log中被标记commit,使命完成。

情况二:修改数据后,rollback
1)在修改数据a=2后,执行rollback操作。
2)会将磁盘的undo log加载到内存中,在undo buffer中,将已更改的a=2数据修改回a=1。
3)内存中实现了回滚操作,最终a=1。

情况三:提交前,断电
1)redo buffer中,a=2 LSN=02写入到redo log中,但还没有把redo log写入磁盘中。
2)断电
3)启动Mysql
磁盘中的redo log 的LSN=01 TXID=t0
ibd数据文件的LSN=01 TXID=t1
磁盘undo log的TXID=t1
LSN相同,但undo log的TXID不同,说明事务没有提交,buffer中的数据丢失,并丢弃undo log。
4)不用前滚和回滚,a=1。

情况四:未提交,但被其他事务顺带写入磁盘
1)修改的数据已经写入redo buffer中的redo log中,redo log还没有刷写到磁盘中,也没有主动commit该事务。
2)此时,redo log中的内容被其他事务顺带写入磁盘,包括:
LSN=02 TXID=t1 数据a=1变成a=2的过程 以及本事务未提交的标记。
3)又双叒叕断电了…
4)启动mysql,对比磁盘数据页LSN=01和磁盘redo log的LSN=02,出现不一致
5)将二者加载到内存中,构造脏页,重新变成断电前的状态,a=1变成a=2的过程,进行前滚。
6)由于磁盘redo log中TXID=t1被标记未提交,于是在data buffer中找到对应的TXID=t1事务,将undo log中的数据加载到内存中,进行回滚操作,data buffer中a=1,保证所有LSN=01。

事务的ACID特性如何实现相关推荐

  1. 数据库事务的ACID特性及含义

    数据库事务的ACID特性及含义 1.原子性(Atomic) 一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作.实现事务的原子性 ...

  2. [MySQL] 事务的ACID特性

    事务的ACID特性: 原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中的所有操作要么都做,要么都不做. 一致性(consistency):事务前后数据的完整性必须保持一致.事 ...

  3. 详述MySQL事务及ACID特性的实现原理

    " 事务是 MySQL 等关系型数据库区别于 NoSQL 的重要方面,是保证数据一致性的重要手段. 本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的 ACID 特性,并分析其实 ...

  4. MySql:事务的ACID特性

    目录 一.事务概念 二.事务的ACID特性 一.事务概念 定义: 一个事务是由一条或者多条SQL语句所组成的一个不可分割的单元,只有事务中的所有操作都正常执行完,那么整个事务才能被提交到数据库.如果有 ...

  5. 深入学习MySQL事务:ACID特性的实现原理

    事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文 ...

  6. 什么是事务,事务的ACID特性

    一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结 ...

  7. 数据库事务的 ACID 特性

    事务 概念:事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚. ACID: 1. 原子性(Atomicity) 事务被视为不可分割 ...

  8. 事务的ACID特性及概念

    事务的概念 所谓事务是用户自定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位.例如,在关系数据库中,一个事务可以是一条sql语句,一组sql语句或整个程序. 事务和程序 ...

  9. 什么是事务?事务的ACID特性

    事务 事务(Transaction)是一个数据库操作序列, 这些操作要么全做,要么全不做,是一个不可分割的工作单位. 事务是恢复和并发控制的基本单位. 事务既可以显式定义,也可以由DBMS自动定义. ...

  10. 谈谈MySQL InnoDB存储引擎事务的ACID特性

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 狼哥一直对数据库Mysql这块没有进行过系统的深入学习,今天看到一篇文章写的还不错,特意分享一下,我不能保证文章中所 ...

最新文章

  1. 对话式AI 2019年遇来的新市场
  2. 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
  3. ARP侦查工具Netdiscover
  4. c语言药房系统书写指导书,C语言药房管理系统[文书借鉴]
  5. 直播回放 | 人工智能强化金融风控(附PPT)
  6. shell脚本输出带颜色字体
  7. docker 启动成功但无法访问_docker nginx 运行后无法访问的问题解决
  8. Java笔记-JNI各种签名以及例子
  9. 10个优秀的Objective-C和iOS开发在线视频教程
  10. PCL_PCLVisualizer在多线程中的使用问题(viewer spinOnce crash)
  11. 干货分享 | 工业信息数据库安全现状与技术分析
  12. 教育信息化2.0建设解决方案
  13. Task 03:python与word和pdf
  14. oracle字符串分割和提取函数定义
  15. Thoughtworks QA测试一面凉经
  16. c语言 虚拟示波器软件下载,虚拟示波器软件(示波器工具)V3.1 官方版
  17. mysql join 性能测试_Mysql Join语法解析与性能分析
  18. 低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)
  19. C语言心语,心语,心缘
  20. Tensorboard报错的解决

热门文章

  1. 机器学习之L1正则化和L2正则化(附源码解析)
  2. JS基础之强制类型转换
  3. openresty中应用murmurHash
  4. 2020CCPC 绵阳 7-4 Defuse the Bombs(二分)
  5. 微软teams软件_如何在Microsoft Teams中创建和管理团队
  6. 微信小程序实现身份证识别功能
  7. 数据可视化--实验五:高维非空间数据可视化
  8. 网络爬虫(一):爬虫基础原理
  9. 在markdown下用mma画函数图像
  10. 发现魔方阵的一个有趣现象