MySQL事务的四大特性的实现

  • 基本概念
  • 原子性实现
  • 隔离性实现
    • 已提交读
    • 可重复读
  • 持久性实现
    • 日志文件刷新策略

基本概念

  • 事务的四大特性ACID :

    • 原子性Atomic : 事务的所有的SQL操作作为一个原子工作单元执行.要么全部执行,要么全部不执行
    • 一致性Consistent : 事务完成后,所有数据状态都是一致的
    • 隔离性Isolation : 如果有多个事务并发执行,那么每个事务做出的修改必须和其余的事务隔离
    • 持久性Duration : 事务完成后,对数据库中数据的修改会持久化存储
  • 事务的四种隔离级别:
隔离级别 脏读 不可重复读 幻读
未提交读Read Uncommitted 可能 可能 可能
已提交读Read Committed 不可能 可能 可能
可重复读Repeatable Read 不可能 不可能 可能
序列化Serializable 不可能 不可能 不可能

原子性实现

  • MySQL数据库事务的原子性通过undo log实现

    • 事务的所有的增删改的修改操作的相反操作都会写入undo log中.比如事务执行一条insert语句,那么undo log就会记录一条对应的delete语句
    • undo log是一个逻辑文件,记录的是相对应的SQL语句.如果事务执行发生异常,导致事务无法成功提交,系统就会执行undo log中相对应的撤销操作,达到事务回滚的目的
    • undo log可以实现MVCC的多个版本并发控制

隔离性实现

已提交读

  • 已提交读Read Committed允许可重复读的实现策略:

    • 数据的读取不加锁,数据的写入,修改,删除需要加锁
    • 可以解决脏读的问题,无法避免不可重复读的问题
  • 使用加锁策略后,不存在读取到脏数据的情况:
    • T1写数据x时,首先获取x的锁,导致T2的读操作等待
    • T1进行数据回滚后,释放锁 ,T2可以继续读取原来的数据

可重复读

  • 可重复读Repeatable Read允许幻读的实现策略 : MVCC多个版本行控制策略
  • 这种情况下会出现T1的更新操作后,导致T2两次读取的数据不一致:
    • 通过加行级锁无法解决读取数据不一致的问题:

      • T2首先读取x
      • T1经过加锁,解锁的步骤,更新x的值,提交事务
      • T2继续读取,读取出来的值是T1更新后的值
      • 这样T2两次读取的结果不一致
  • MVCC多版本行控制:
    • 行级锁是一个悲观锁 ,MVCC是一个乐观锁.乐观锁可以在一定程度上避免加锁操作,开销更低
    • InnoDBMVCC实现是通过保存数据在某个时间点的快照来实现的
    • 一个事务,不管执行多长时间,内部看到的数据是一致的.也就是说,事务在执行过程中不会相互影响
  • MVCC多版本行控制的具体实现:
    • 通过在每行记录后面保存两个隐藏的列来实现多版本行控制
    • 一个列保存了行的创建时的系统版本号
    • 一个列保存的行的过期时的系统版本号,也就是删除时的系统版本号
    • 每次开始一个新的事务,系统版本号就会递增
      • SELECT操作:

        • 只会查找版本早于或者等于当前事务版本的数据行.这样可以保证事务读取的行,要么是事务开始前就存在的行,要么是事务自身插入或者修改的行
        • 行的删除版本要么是未定义版本号,要么大于当前事务版本号.这样可以保证事务读取的行,在事务开始之前未删除
      • INSERT操作:
        • 将新插入的行保存当前版本号为行版本号
      • DELETE操作:
        • 将删除的行保存当前版本号为删除标识
      • UPDATE操作:
        • UPDATE操作作为DELETE操作和INSERT操作的组合

          • DELETE操作保存当前版本号到原来的行作为删除标识
          • INSERT操作的行保存当前版本号作为行版本号
  • MVCC多版本行控制策略可以确保一个事务中读取的是同一个数据库版本快照

持久性实现

  • MySQL数据库事务的持久性是通过redo log实现的:

    • 事务的所有增删改的修改操作,数据库都会生成一条redo日志到redo log
    • redo log区别于undo log中记录的SQL语句 ,redo log记录的是事务对数据库的哪个数据页做了什么样的修改,属于物理日志
  • redo日志的使用场景:
    • 数据库系统直接崩溃,需要进行恢复
    • 通常情况下,数据库都会按时间点备份的策略,首先将数据库恢复到最近备份的时间点状态,然后读取这个时间点之后的redo log记录,重新执行相应记录,达到最终恢复的目的

日志文件刷新策略

  • 日志文件undo log和redo log不是直接写入到磁盘中,而是写入log buffer,然后等待合适的时机同步到OS buffer,然后由操作系统决定刷新到磁盘的时间
  • MySQL主要有三种日志刷新策略:
    • 每次事务提交写入OS buffer, 并调用fsync刷新到磁盘中
    • 每秒写入OS buffer, 并调用fsync刷新到磁盘中
    • 每秒提交写入OS buffer, 然后每秒调用fsync刷新到磁盘中
  • MySQL默认使用第一种日志刷新策略,安全性依次下降,效率依次上升

MySQL中事务四大特性的实现详解相关推荐

  1. yii mysql 事务处理_Yii2中事务的使用实例代码详解

    前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...

  2. mysql数据库事务四大特性的实现原理

    事务的四大特性 原子性.一致性.隔离性.持久性 原子性实现 原子性保证事务要么全执行成功,要么全不执行. mysql使用回滚机制实现,undo log实现回滚. 事务执行 insert.update. ...

  3. MYSQL数据库事务的隔离级别(详解)

    一.概述 数据库事务的隔离级别分为四种:(后面为解决的问题,结合下文案例深入理解) 1.读未提交(Read Uncommited)事务1修改的数据被事务2给回滚了 2.读已提交(Read Commit ...

  4. mysql repeatableread_mysql-Innodb事务隔离级别-repeatable read详解(转)

    一.事务隔离级别 ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串 ...

  5. mysql repeatableread_mysql-Innodb事务隔离级别-repeatable read详解1

    经验总结: Python使用MySQLdb数据库后,如使用多线程,每个线程创建一个db链接,然后再各自创建一个游标cursor,其中第一个线程读一个表中数据为空,第二个写入该表一条数据并提交,第一个线 ...

  6. mysql中获取时间的年月日_详解mysql 获取当前日期及格式化

    MySQL 获取当前日期及日期格式 获取系统日期: NOW() 格式化日期: DATE_FORMAT(date, format) 注: date:时间字段 format:日期格式 返回系统日期,输出 ...

  7. MySQL中的sum函数用法实例详解

    今天分享一下mysql中的sum函数使用.该函数已经成为大家操作mysql数据库中时常用到的一个函数,这个函数统计满足条件行中指定列的和,想必肯定大家都知道了,本身就没什么讲头了,这篇文章主要是通过几 ...

  8. mysql float 1,MySql中float类型含义及参数详解

    float表示浮点数,通俗点来说的话,我们可以简单理解为小数 参数有两个: M表示精度,表示浮点数的位数 D表示标度,表示小数位数 M位数不包括小数点位数 举例:float(6,2) 则最大范围表示: ...

  9. mysql中事务的特性_mysql中事务的四大特性

    原子性(Atomicity) 事务就像"原子"一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况. 一致性(Consistency) ...

最新文章

  1. python解压zip文件_Python中最快解压zip文件的方法
  2. q函数表格怎么看_会计表格函数玩不会?超实用会计表格函数公式大全,财务人都在用...
  3. html导航教程视频,导航_HTML+CSS前端基础知识教程_腾讯视频
  4. apache2.4.39 php,win7 配置AMP环境(apache2.4.39 + php7.1.28)
  5. GitHub 疑被审查?著名“换脸”开源项目遭限制访问
  6. php不使用插件导出excel
  7. iOS App打包上架超详细流程1
  8. skywalking使用mysql_SkyWalking 使用 MySQL Storage
  9. java中的值传递与引用传递
  10. 登录虚拟服务器,虚拟化服务器登录及操作方法说明
  11. JAVA音视频解决方案----JTT1078-2016文档梳理与一些难点梳理
  12. 计算机开机只显示,电脑开机黑屏只显示光标怎么办?来看看几种原因分析及解决方法!...
  13. 三、Python复习教程(重点)- 前端框架实战
  14. SpringCloudAlibaba之gateway网关
  15. PNG透明图片在IE浏览器中正确显示
  16. 设置esxi主机时间
  17. 奥特曼系列ol以前的服务器恢复,奥特曼系列ol怎么看之前登录过的大区
  18. 桌面级与企业级硬盘的区别
  19. 苏宁智慧零售2018: 大象轻舞,一动千钧 | 一点财经
  20. 施工企业物资管理软件

热门文章

  1. “竞赛是我们招聘的主要渠道”——数据科学家与竞赛小咖畅谈
  2. 找不到夺神之权服务器,3月23日夺神之权服务器停机更新公告
  3. 材料作文-不畏艰辛奋勇前行
  4. 盐城北大青鸟射阳中专基地军训丨不畏艰难,青春无悔
  5. 大前端DUX主题首页公告栏添加更多版块,“今日推荐”、“联系我们”版块
  6. chimee视频播放插件
  7. vue pdf文件下载 / 在线预览真是有效!
  8. 树莓派设置VNC server 远程桌面
  9. android 自定义旋转转盘(类似抽奖转盘)
  10. Android Observer与Observable