「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战
面试中如果被问到这道题,是有一定的难度的。在参加面试过程中,你可能会被问到过说事务的四个特点分别是什么?你会说 ACID,但是在更高级别面试的时候,可能会问到它对应的一些实现原理,也就是说你要知道知其然,还要知道其所以然,这个过程是比较麻烦的。
这道题面试如果你要抛开来讲的话,或者展开来说的话,知识点非常多。
原子性
原子性是由 undolog 日志来保存的,它记录了需要回滚的日志信息。事务回滚时,撤销已经执行成功的 SQL 语句,什么意思?我们做增、删、改这样一些 SQL 操作,它之前已经保留好一个历史版本数据了,而这个历史版本数据会存在于 undolog 中,所以当你进行回滚的时候,它会找到你对应的一个历史版本数据,然后进行回写,把之前成功执行的 SQL 语句给你撤销掉,这个时候就完成了最基本的一个回滚操作,这是原子性对应的一个保证。
一致性。
一致性是我们在进行数据库操作的时候一个最根本的一个追求。比如事务最根本和最终要保证的就是一致性。一致性什么实现呢?由其他三大特性来保证,也就是说原子性、隔离性、持久性共同保证了一致性,也就是说程序代码上面要保证业务的一个一致性,一致性是我们最根本的一个追求。
隔离性
什么叫隔离性?我们要保证我事务之间彼此是不会受相互打扰的,每个事务跟每个事务都是相互隔离的。因此,这个时候需要通过 MVCC 技术来进行实现。MVCC 是多版本并发控制,这种技术非常麻烦,它包含了非常多的信息。隔离性是由 MVCC 来保证。
持久性
持久性是用什么来保证的?持久性由 redolog 来进行保证,MySQL 修改数据的时候会在 redolog 中记录一份日志数据,就算数据没有保存成功,只要日志保存成功了,数据仍然不会丢失。这个怎么理解呢?每次在更新数据的时候,你的数据是一定要持久化到磁盘的,每次更新的数据在磁盘里面是乱序排放的,或者说它没有一个规律。我们如果想去磁盘里面进行修改的话,必须要找到对应的记录并且进行修改。这个过程很麻烦,如果熟悉操作系统,应该知道这个过程属于叫随机读写,效率比较低。而我们写了 redolog 之后,它完成什么功能?日志日志一般情况下都是顺序读写的,顺序读取的效率跟随机读取的效率差的不是一个级别。因此我们在进行数据更改的时候,只要先保证我的日志写成功了,它是一个顺序的方式,效率比较高,只要它写成功了,就算你的数据没有写成功,没关系,我依然可以根据我们的 redolog 来进进行数据的实际化操作,也就是最终也可以把数据找回来,存储到我们的磁盘里面。
当然如果在面试的时候,面试官问得更加深入的话,这里还有个坑,redolog 和 binlog 日志是如何保证一致的,这里面会有一个两阶段提交的问题,而至于两阶段提交,这里不做介绍。