1、Mysql怎么保证一致性的?

OK,这个问题分为两个层面来说。

从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。

但是,如果你在事务里故意写出违反约束的代码,一致性还是无法保证的。例如,你在转账的例子中,你的代码里故意不给B账户加钱,那一致性还是无法保证。因此,还必须从应用层角度考虑。

从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据!

2、Mysql怎么保证持久性的?

OK,是利用Innodb的redo log。

正如之前说的,Mysql是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再刷回磁盘上。如果此时突然宕机,内存中的数据就会丢失。

怎么解决这个问题?

简单啊,事务提交前直接把数据写入磁盘就行啊。

这么做有什么问题?

只修改一个页面里的一个字节,就要将整个页面刷入磁盘,太浪费资源了。毕竟一个页面16kb大小,你只改其中一点点东西,就要将16kb的内容刷入磁盘,听着也不合理。

毕竟一个事务里的SQL可能牵涉到多个数据页的修改,而这些数据页可能不是相邻的,也就是属于随机IO。显然操作随机IO,速度会比较慢。

于是,决定采用redo log解决上面的问题。当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据undo log和binlog内容决定回滚数据还是提交数据。

最新文章

  1. BZOJ 2743 【HEOI2012】 采花
  2. 各种报错各种坑 webpack让我在学习的过程中一度想要放弃
  3. linq group by子句
  4. 判断scrollview是否滚动到了底部
  5. Using python to process Big Data
  6. 理解和使用NT驱动程序的执行上下文
  7. ZOJ 3778 Talented Chef 模拟 [ 祝愿明天省赛一帆风顺, ZJSU_Bloom WILL WIN : )
  8. 关于js关闭浏览器技术细谈
  9. Caffe-5.2-(GPU完整流程)训练(依据googlenet微调)
  10. Core Animation 文档翻译 (第四篇)
  11. 关于使用Xcode自带的单元测试UnitTest的介绍
  12. Mybatis增删改查,Demo整合
  13. selenium笔记(1)
  14. hdu-2072(字典树)
  15. Ionic3.0 输入状态时隐藏Tabs栏
  16. java中的动态代理Proxy
  17. PC平台在Unity3D中播放硬盘ogg,mp3,wav文件
  18. (5)ps详解 (每周一个linux命令系列)
  19. Haskell语言学习笔记(86)字符串格式化与插值
  20. TypeScript设计模式之装饰、代理

热门文章

  1. Ethical Hacking - Web Penetration Testing(3)
  2. Hexo 踩坑:jquery 报错
  3. 重磅分享:美团点评架构师私藏的内部Linux运维笔记
  4. Goorm永久免费的VPS
  5. 如何看待HTTP/3
  6. scratch编程我的世界3D史蒂夫
  7. java 手机号码归属地查询
  8. 玩LOL间歇性卡顿(FPS突然降低又马上恢复)?Windows10间歇性卡顿?
  9. vue学习(十二) 指令v-if v-show 控制页面标签的显示与隐藏
  10. Golang获取目录下的文件及目录信息