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