mysql的acid原理

1.mysql的一致性如何保证?
一致性说明要保证mysql的事务前后数据状态一致,显然事务中数据的状态一致需要我们应用层来控制,例如转帐操作,a-10,而b+5,那么数据肯定不是一致的。
所以第一条:应用层要控制逻辑,保证数据一致性。
2.由于innodb的原子性(一个事务中的操作要么全部成功要么全部失败),隔离性(事务直接的操作是隔离的,互不影响),持久性(保证提交的事务一定成功,不会丢失),所以才能保证数据的一致性。
2.mysql的原子性如何保证的?
原子性故名字义就是原子操作,即要么全部成功,要么全部失败,事实上,mysql在处理事务中,会先把数据load到内存中进行操作,如果内容中OK,才会进行写到磁盘中,同时会把操作写到日志中,即undo log,
假如需要回滚了,那么只需要检查undo log ,就可以进行数据还原
可以理解成:
1)当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据
2)当你update一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作
3)当年insert一条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执行delete操作
insert时,实际上是真的执行了写入,可以验证发现rollback后auto_increment的ID已经增加了;但是rollback后,仅仅是数据回滚了,但是自增ID并不能减小。
总结:依赖undo log来实现原子性的,因为每次操作都会在内存中执行,然后执行的结果会写到undo log中,相当于根据undolog可以恢复到事务之前的状态,因此如果rollback,可以根据undolog进行回滚,保证了原子性。

3.mysql的持久性如何保证?
持久性顾名思义就是数据的持久性,即提交修改的数据应该被持久化到数据库中,由于数据的修改执行的过程中是先在内存中执行的,因此如何保证内存中的数据一定能持久化到磁盘中,这就是如何保证持久性的关键。
mysql在内存中执行时,会先把数据页(page)取到内存中,数据页一般是16kb,要知道这16kb并不是一个很小的单元,内存中执行成功后,会把数据页中对应的数据信息写到Redo log中,然后当commit的时候,从redo log持久化到磁盘中,redo log其实也是磁盘+内存存储,因此可以保证持久性。因此当服务器宕机的时候是可以保证redo log不丢失,因此就可以保证提交的数据不会丢失。
使用redo log的好处?
1.可以保证持久性,防止宕机后内存数据丢失。
2.redo log是顺序io,磁盘页数据是随机io,因此先持久化到顺序io后更好,当commit后,才刷新到随机io中。
3.redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。
4.mysql是隔离性如何保证?
mysql的隔离性保证首先要设置隔离级别大于readUncommit才可以,否则是没有隔离性的。
隔离性需要依赖锁和mvcc来实现。
例如两个事务同时update ,则会使用拍他锁或者表锁来进行隔离,如果是一个事务写,一个事务读取,那么另一个读事务只能读到已经commit的数据,未commit的数据是无法读取到的,原因是读事务读取了数据的mvcc快照,快照数据存放与undo log中,因此undo log还可以用来提供数据快照版本,这样保证了隔离性。

参考:https://blog.csdn.net/fujiandiyi008/article/details/90056284

发布了10 篇原创文章 · 获赞 0 · 访问量 145

猜你喜欢

转载自blog.csdn.net/weixin_37599299/article/details/103411518