数据库的ACID的实现原理

概念

数据库具有事务特征,事务具有ACID特征,分别是原子性、一致性、隔离性、持久性。
那么ACID的实现原理又是具有什么实现的,就拿mysql来说明。

原理

mysql具有redo log 和undo log,这二种文件都是事务相关的问题。

在这里插入图片描述
每次开启一个事务,则mysql的innodb引擎就会生成一张undo log文件,该文件主要记录这个事务ID所产生的一些更新、删除、插入操作。

当事务1执行update的时候,就会将udpate记录到undo log文件,当事务进行commit的时候,就会将undo log文件删除,如果回滚时,则会根据undo log文件的内容进行执行插入回滚SQL脚本。

redo log 文件是数据库的一个共享的文件,也是一份写缓存的文件,试想一下,每次操作读写都需要去访问磁盘的随机IO,其实会很耗时,因此可以将一些频繁的页内容加载到内存的一个缓存buffer中,当进行读操作时去查看缓存buffer是否有对应的数据,如果没有,则去磁盘查询,查询后再将查询的结果写入到缓存buffer。当执行写操作的时候,就先去更新缓存buffer,等到一定时间,将缓存buffer的数据再一次写入到磁盘中。但是这样就会有一个数据一致性的问题了,假设buffer的数据没有flush到磁盘,mysql服务器就宕机了,那内存的buffer的数据也会清空,redo log就解决了数据一致性的问题。

写操作的时候,不会写入到缓存buffer中,而是写入到redo log中,当事务提交后,redo log的内容就flush到磁盘中,redo log是一个文件,当服务器宕机了,也不影响redo log已保存后的数据,当mysql进行宕机后,redo log还是有内容的,如果想事务提交,则就执行redo log的数据到磁盘,一般而言是会将redo log的数据进行回滚,也就是删除数据。

原子性

auto log 记录了更新的操作,如果回滚,则重新提交回滚的sql,保证了原子性

持久性

redo log 保证了持久性,事务提交了,redo log的内容就会flush到磁盘中。

隔离性

mysql采用mvcc进行,通过版本链、read view以及隐藏的三个字段来实现,具体可以百度

一致性

一致性是说明数据库的数据需要再事务操作之后保存一致,如果钱不会凭空增多或者减少,这样就需要再保证原子性、持久性、隔离性,再通过应用层保证一致性。


版权声明:本文为qq_38240227原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。