文章目录

  • 1.实现原子性
  • 2.实现持久性
  • 3.实现隔离性
  • 4.实现一致性

先介绍一下事务的四大特性(ACID)

原子性( A ): 事务是最小的工作单元,不可再分,事务中的操作要么都发生,要么都不发生。

一致性( C ): 事务前后数据的完整性必须保持一致。

隔离性 ( I ): 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性( D ): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

那么数据库是如何保证事务的这四个特性的呢?

1.实现原子性

使用 undo log
原子性要求我们事务当中的操作必须同时成功或同时失败,如果事务中的一些操作执行失败了,那么之前执行成功的操作就要进行回滚。InnoDB实现回滚机制靠的就是undo log ,当事务对数据库进行修改时,InnoDB会生成对应的日志,如果事务执行失败需要进行回滚的时候,就可以利用记录的日志信息进行回滚操作。undo log记录的是逻辑日志,它记录的是sql相关的信息,当回滚的时候InnoDB会根据日志内容进行相反的操作。例如日志当中记录的是Insert操作,回滚的时候都会进行一个update操作。

2.实现持久性

使用 redo log
InnoDB这个存储引擎的数据是放在磁盘当中的,当我们进行IO操作的时候是非常慢的,于是InnoDB提供了 Buffer Pool(缓存) Buffer Pool当中存了磁盘中的部分数据页的映射。当进行读操作的时候会首先去Buffer Pool当中读取,若没有找到再去磁盘读取,读取完之后放入Buffer Pool中。当进行写操作的时候首先写入Buffer Pool当中去,BUffer Pool会定期把数据刷新到磁盘当中去(刷脏操作)。

目前来看一切正常,使用Buffer Pool解决了效率问题,但是也引入了新的问题,如果Mysql宕机了,并且Buffer Pool 当中的数据还没有刷新到磁盘当中去,就会导致数据的丢失。

此时,我们的主角 redo log登场,redo log 采用的是WAL(write ahead logging 预写式日志),当输入进行修改操作之后,会先把这条修改操作保存到 redo log 当中去(磁盘中),然后再更新Buffer Pool当中的数据,保证了数据不会丢失

此时可能大家会有这样的疑问:为什么要多使用一个redo log日志呢,每次修改完直接刷到磁盘中不行吗?可以是可以,但是成本太高了,写入redo log 比刷脏快很多!原因有以下两点:

  • 刷脏是随机IO,每次要修改的地方都不一样,redo log是追加操作,是顺序IO
  • 刷脏是以数据页为单位的,一个数据页大小为16KB,redo log只需要写入一行或多行真正需要的操作就可以了

3.实现隔离性

锁机制(同时写)//明天更新
mvcc(一读一写)//明天更

4.实现一致性

  • 保证原子性,持久性和隔离性
  • 数据库本身提供保证,例如字符串长度不能超过列的限制
  • 应用层面进行保证

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

  1. mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

    前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...

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

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

  3. 诸葛io的技术架构图_【总结】MySQL技术内幕二:InnoDB存储引擎技术特性

    二.InnoDB存储引擎 InnoDB是事务安全的MySQL存储引擎,通常是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoDB的存在,才使MySQL数据库变得更有魅力. 从MySQL 5 ...

  4. Innodb存储引擎的特性(2)

    关于锁还有两个被经常提到的概念,就是阻塞和死锁,我发现开发人员会经常混淆,两种错误,所以我觉得有必要在这里强调一下,两个锁的问题,首先什么是阻塞呢,阻塞是因为不同锁的兼容性的关系,在有些时刻,一个事务 ...

  5. InnoDB——锁、事务和复制

    锁 数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. InnoDB存储引擎中的锁 共享锁(S Lock),允许事务读一行数据 排他锁(X Lock),允许事务删除或更新一行 ...

  6. 4种事务特性,5种隔离级别,7种传播行为

    去面试,面试官问,说一下spring事务的几种隔离级别,你项目用的是哪个.一脸茫然,之后...... 什么是事务? 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务 ...

  7. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)

    转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...

  8. Kafka事务特性详解

    Kafka在0.11版本中除了引入了Exactly Once语义,还引入了事务特性.Kafka事务特性是指一系列的生产者生产消息和消费者提交偏移量的操作在一个事务中,或者说是一个原子操作,生产消息和提 ...

  9. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  10. 什么是事务、事务特性、事务隔离级别、spring事务传播特性

    1.什么是事务: 事务是指程序中的一个操作序列.其特点是:该序列的所有操作要么全部成功完成,要么只要有一个操作失败,则该序列所有操作都将被撤销.这也是事务的原子性(要么成功,要么失败). 2.事务特性 ...

最新文章

  1. 数据持久化(六)之Using CoreData with MagicalRecord
  2. Selenium八种基本定位方式---基于python
  3. centos 6.8 安装telnet-server服务
  4. 解决 Angular 官网下载的库 Schematics 执行 npm run build 时遇到的编译错误
  5. innerHTML的用法
  6. java中单例模式的3种实现
  7. jquery获取radio的值,a标签传值
  8. 为什么不用小驼峰也能查到数据库数据_为什么不用驼峰命名创建表名和字段?...
  9. 随想录(工作后的一点思考)
  10. ubuntu pycharm mysql_ubuntu安装mysql pycharm sublime
  11. keyshot分辨率多少合适_分辨率单位及换算详解
  12. java web 常见面试题_2019最新Javaweb面试题及答案
  13. 名师李涛老师主讲 Photoshop CS2 (全教程下载)
  14. 如何查看自己已连接WiFi的密码
  15. 高质量程序设计指南(笔记)
  16. 电脑网络异常故障解决办法
  17. PMP---项目经理解决冲突的8种模式,走过路过不要错过
  18. cshop是什么开发语言_客户端产品一般是用什么编程语言写的?
  19. 搭建CA并签发数字证书
  20. 2023年外贸行业面临的现状

热门文章

  1. ps——投影字体效果
  2. oracle 文本日期相减,日期相减等于整数的问题
  3. SCDM(3)建立几何
  4. 怎么把WORD中插入的图片改为统一尺寸的,看这里,文档中图片怎么改成同样大小
  5. 怎么批量修改图片尺寸大小?
  6. 计算机表格怎么添加单下划线,如何在excel表格中添加并设置下划线
  7. 联想计算机睡眠如何唤醒,笔记本电脑休眠和睡眠如何唤醒
  8. 自学编程的5个技巧总结
  9. 计算机编程自学怎么样?
  10. 深度解读央行数字货币 DCEP